gpt4 book ai didi

sql-server - MS SQL JDBC 驱动程序在 Tomcat 9 上使用 JNDI Hikari 创建内存泄漏

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

我在 Tomcat 9.0.7 上使用 JNDI + HikariCP,配置如下:

 <Resource name="jdbc/mydb" auth="Container"
factory="com.zaxxer.hikari.HikariJNDIFactory"
type="javax.sql.DataSource"
minimumIdle="5"
maximumPoolSize="20"
connectionTimeout="300000"
dataSourceClassName="com.microsoft.sqlserver.jdbc.SQLServerDataSource"
dataSource.url="jdbc:sqlserver://server:1433;databaseName=mydb"
dataSource.user="fantomas"
dataSource.password="somepassword"
closeMethod="close"
/>

当我在没有部署任何 WAR 的情况下运行 tomcat(只是标准安装,仅此而已)时,我在 Catalina 日志中有以下警告:

09-May-2018 10:15:16.971 WARNING [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [host-manager] appears to have started a thread named [mssql-jdbc-TimeoutTimer-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:460)
java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:941)
java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1073)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
java.lang.Thread.run(Thread.java:748)

哪里出了问题,为什么会泄漏?我该如何解决?

UPDATE-1Tomcat 安装的./lib 中的自定义库是:

ms-sql-6.4.0.jre8.jar 
slf4j-api-1.7.25.jar
HikariCP-2.7.8.jar

UPDATE-2Hikari 3.1.0 和 Tomcat 9.0.8 也有同样的问题

最佳答案

有问题的线程 (mssql-jdbc-TimeoutTimer) 属于 MSSQL 驱动程序。它会在您使用 HikariCP 而不是 Tomcat JDBC 时显示,因为 HikariCP 适本地使用 JDBC 超时 API 来提高可靠性。

这是 MSSQL 驱动程序的一个已知问题,search for 'mssql-jdbc-TimeoutTimer' here .

看来定时器是HikariCP调用Connection.isValid()的MSSQL驱动实现启动的。因此,您可能可以通过设置 connectionTestQuery 来避免此问题,这将禁用 isValid() 的使用。

关于sql-server - MS SQL JDBC 驱动程序在 Tomcat 9 上使用 JNDI Hikari 创建内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50248823/

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