gpt4 book ai didi

java - JNDI 数据源模式

转载 作者:行者123 更新时间:2023-11-28 22:54:17 28 4
gpt4 key购买 nike

我在 Tomcat8 中使用 JNDI 资源连接到 MS-SQL 数据库 (Azure)。我随机遇到 Connection closed 异常,最终发生 Connection peer reset 事件。发生这种情况时,服务已死(运行到 Connection closed for every request)并且重新启动 tomcat (redploying) 是重新启动它的唯一机会。

在我尝试解决这个问题的过程中,我双重(三次)检查了每个未关闭连接的方法,我确保每个连接都以 try-with-ressource 打开。

目前我正试图更好地了解 JNDI 资源和连接池,我想问的是实现注入(inject)到其他服务的服务类的首选模式是什么。例如。问题是

  1. 调用ctx.lookup()应该把DataSource分配到哪里?在方法级别或类范围?例如。使用 hk2 @Service 注释时,服务似乎只实例化一次,而不是按请求实例化。目前 ctx.lookup() 被调用一次(在构造函数中)并且 DataSource 存储在类字段中,稍后由使用 this 的方法访问。数据源。这有意义吗?或者应该在每次请求(=方法调用)时检索 DataSource

  2. 如何验证数据源的多个选项的执行情况,例如testOnBorrowremoveAbandoned(请参阅下面的完整配置)是否正确执行?有一个选项 logAbandoned 但我在日志中看不到任何内容。无论如何,这应该出现在哪里?我能以某种方式为池指定特定的日志级别吗?我只找到了 org.apache.tomcat.jdbc.pool,但是这个类似乎只在创建池时被调用(至少这是日志出现的唯一时刻,即使在级别 最好的).

  3. 是否存在我不知道的一般模式?

这是我当前的配置:

<Resource name="jdbc/mssql"
auth="Container"
type="javax.sql.XADataSource"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
username="***"
password="***"
url="jdbc:sqlserver://***.database.windows.net:1433;database=***;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
removeAbandonedOnBorrow="true"
removeAbandonedTimeout="55"
removeAbandonedOnMaintenance="true"
timeBetweenEvictionRunsMillis="34000"
minEvictableIdleTimeMillis="55000"
logAbandoned="true"
validationQuery="SELECT 1"
validationInterval="34000"
/>

谢谢,gapvision

最佳答案

Gapvision,您可以查看此链接 - What is the good design pattern for connection pooling?

您可能希望使用对象池模式。希望这有帮助!!

关于java - JNDI 数据源模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31762138/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com