首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >驱动程序在Tomcat 9上使用JNDI Hikari创建内存泄漏

驱动程序在Tomcat 9上使用JNDI Hikari创建内存泄漏
EN

Stack Overflow用户
提问于 2018-05-09 08:30:21
回答 2查看 2.9K关注 0票数 2

我在Tomcat9.0.7上使用JNDI + HikariCP,配置如下:

代码语言:javascript
复制
 <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日志中有以下警告:

代码语言:javascript
复制
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)

出了什么问题,为什么会漏水?我怎么才能修好它?

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

代码语言:javascript
复制
ms-sql-6.4.0.jre8.jar 
slf4j-api-1.7.25.jar 
HikariCP-2.7.8.jar 

更新-2与Hikari3.1.0和Tomcat9.0.8的相同问题

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-24 10:20:26

所讨论的线程()属于MSSQL驱动程序。当您使用HikariCP (而不是Tomcat )时,它就会显示出来,因为为了可靠性,HikariCP恰当地使用JDBC。

这是MSSQL驱动程序在这里搜索‘mssql TimeoutTimer’中的一个已知问题。

似乎计时器是由HikariCP对Connection.isValid()的MSSQL驱动程序实现的调用启动的。因此,您可以通过设置connectionTestQuery来避免这个问题,这将禁用isValid()的使用。

票数 3
EN

Stack Overflow用户

发布于 2018-05-23 08:11:07

相关问题类似的向hikari报告泄漏,最后的解决方案似乎不是使用Hikari工厂,而是使用Tomcat的数据资源

试着将工厂改为:

代码语言:javascript
复制
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"

编辑

您为Hikari创建了一个新的问题

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50248823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档