Tomcat服务器关闭时,如果在线程中使用JDBC数据库连接,它们会被释放吗?

Posted

技术标签:

【中文标题】Tomcat服务器关闭时,如果在线程中使用JDBC数据库连接,它们会被释放吗?【英文标题】:Will JDBC database connections get released if they're used in a thread when Tomcat server shuts down? 【发布时间】:2014-06-17 18:13:13 【问题描述】:

我们的网络应用程序有一个 Tomcat 堆栈,并使用 javax.sql.DataSource 进行数据库连接。我们有一些方法可以完成很多用户不需要等待的数据库工作,我们希望将它们放入一个线程并在后台运行,让用户继续他们愉快的方式。

我想出的最简单的方法是将数据库访问 (DAO) 代码包装在匿名 Runnable 中并将其传递给线程。

高级开发人员担心但不确定如果Tomcat服务器在执行过程中停止,数据库连接是否会被释放,或者它是否会在事务中闲置直到时间结束。

这是一个可能的问题吗?如果是这样,我们将如何解决它,以便如果线程被中断/杀死,数据库连接会被正确释放?

PS - 我很确定我遗漏了一些东西,请在 cmets 中进行澄清。

【问题讨论】:

那为什么高级开发人员不测试呢?或者你测试过吗? 【参考方案1】:

当一个进程终止时,该进程建立的所有 TCP/IP 连接都将被关闭。但是,如果数据库服务器(取决于供应商/版本)无法识别这一点并且仍然保持其会话处于活动状态,则可能仍然存在泄漏。这可能是因为应用程序没有以正常方式(即调用connection.close())关闭连接。

如果您有足够的权限,应该有一种方法可以检查数据库服务器上仍然存在的连接或会话。

【讨论】:

我想说的是,一般来说数据库服务器会检测到断开连接的套接字并关闭连接/会话。

以上是关于Tomcat服务器关闭时,如果在线程中使用JDBC数据库连接,它们会被释放吗?的主要内容,如果未能解决你的问题,请参考以下文章

linux系统下怎么关闭tomcat?

Tomcat Guice/JDBC 内存泄漏

tomcat使用stop.sh脚本无法关闭

tomcat 线程数与 mysql 连接数综合调优

hibernate和tomcat的连接池问题

如何记录 Tomcat 7 JDBC 连接池、连接创建