当前位置: 首页 > 知识库问答 >
问题:

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

鲜于星波
2023-03-14
 <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"
      />
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中的UPDATE-1自定义库有:

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

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

共有1个答案

楚修为
2023-03-14

有问题的线程(mssql-jdbc-TimeoutTimer)属于MSSQL驱动程序。当您使用HikariCP时,它就会出现,而不是Tomcat JDBC时,因为为了可靠性,HikariCP适当地使用了JDBC超时API。

这是MSSQL驱动程序的一个已知问题,请在此处搜索'mssql-jdbc-timeouttimer'。

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

 类似资料:
  • 我使用了Spark 2.1.1,并升级到了最新版本2.4.4。我从Spark UI观察到驱动程序内存在不断增加,在长时间运行之后,我出现了以下错误:java。lang.OutOfMemoryError:超出GC开销限制 在Spark 2.1.1中,驱动程序内存消耗(存储内存选项卡)极低,在运行ContextCleaner和BlockManager后,内存正在减少。 此外,我测试了Spark版本2.

  • 当我们试图取消部署应用程序时,一些Oracle类似乎正在泄漏。在使用旧的OJDBC14.jar驱动程序时,我没有看到这种情况,但我们不能使用这些驱动程序,因为我们正在迁移到Oracle11g,这需要更新的驱动程序。我猜这是Oracle驱动程序中的bug?我能做些什么来清理这些资源吗?我尝试关闭数据库连接池和其他东西,但没有成功... 我不使用Tomcat的连接池会更好吗?我们宁愿让服务器连接到数据

  • 我是否正确理解了客户端模式的文档? 客户端模式与驱动程序在应用程序主程序中运行的集群模式相反? 在客户端模式下,驱动程序和应用程序主程序是独立的进程,因此+必须小于计算机的内存? 在客户端模式下,驱动程序内存不包括在应用程序主内存设置中吗?

  • 如何在mongo db中创建一个可以公开集合中所有文档的视图?我使用了以下代码: 我正在尝试用管道空列表,但它不工作。你能帮忙吗?

  • 问题内容: 我刚刚接受采访,并被要求使用Java 造成内存泄漏。 不用说,我对如何开始创建它一无所知。 一个例子是什么? 问题答案: 这是在纯Java中创建真正的内存泄漏(运行代码无法访问但仍存储在内存中的对象)的好方法: 该应用程序将创建一个长期运行的线程(或使用线程池更快地泄漏)。 线程通过(可选,自定义)加载类。 该类分配大量的内存(例如),在静态字段中存储对它的强引用,然后在中存储对自身的

  • 问题内容: 运行Web应用程序时,我收到此消息。它运行正常,但是我在关机期间收到此消息。 严重:Web应用程序注册了JBDC驱动程序[oracle.jdbc.driver.OracleDriver],但在Web应用程序停止时未能注销它。为了防止内存泄漏,已强制注销JDBC驱动程序。 任何帮助表示赞赏。 问题答案: 从6.0.24版本开始,Tomcat附带了内存泄漏检测功能,当webapp中存在与J