我在 Tomcat8 中使用 JNDI 资源连接到 MS-SQL 数据库 (Azure)。我随机遇到 Connection closed
异常,最终发生 Connection peer reset
事件。发生这种情况时,服务已死(运行到 Connection closed
for every request)并且重新启动 tomcat (redploying) 是重新启动它的唯一机会。
在我尝试解决这个问题的过程中,我双重(三次)检查了每个未关闭连接的方法,我确保每个连接都以 try-with-ressource
打开。
目前我正试图更好地了解 JNDI 资源和连接池,我想问的是实现注入(inject)到其他服务的服务类的首选模式是什么。例如。问题是
调用
ctx.lookup()
应该把DataSource
分配到哪里?在方法级别或类范围?例如。使用 hk2@Service
注释时,服务似乎只实例化一次,而不是按请求实例化。目前ctx.lookup()
被调用一次(在构造函数中)并且DataSource
存储在类字段中,稍后由使用this 的方法访问。数据源
。这有意义吗?或者应该在每次请求(=方法调用)时检索DataSource
如何验证数据源的多个选项的执行情况,例如
testOnBorrow
和removeAbandoned
(请参阅下面的完整配置)是否正确执行?有一个选项logAbandoned
但我在日志中看不到任何内容。无论如何,这应该出现在哪里?我能以某种方式为池指定特定的日志级别吗?我只找到了org.apache.tomcat.jdbc.pool
,但是这个类似乎只在创建池时被调用(至少这是日志出现的唯一时刻,即使在级别最好的
).是否存在我不知道的一般模式?
这是我当前的配置:
<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/