java - Servlet 的 destroy 方法没有关闭数据库连接,即使我也告诉过它

标签 java servlets jdbc

所以我有一个 servlet 每分钟查询一次数据库,所以我想我只会永远打开一个连接(好吧,直到 web 应用程序停止)。因此,我在 init() 中打开一个连接,并在 destroy() 中关闭它。问题是,如果我在 tomcat 中停止应用程序后查看数据库,连接仍然打开。发生什么事了?

这是我的代码:

public void init() throws ServletException
{
    try
    {
        // Prepare the DB connection
        DriverManager.registerDriver(new com.informix.jdbc.IfxDriver());
        informixConnection = DriverManager.getConnection(DBURL, DBUsername, DBPassword);
    }
    catch(SQLException e)
    {
        throw new UnavailableException("Error connecting to the database");
    }
}

public void destroy()
{
    try
    {
        informixConnection.close();     
    }
    catch(Exception e)
    {
    }
}

还有一个实际执行查询的方法和一个 doGet,以便用户可以获得最新的响应,但我还没有完成这些(尽管我已经测试了它们并且数据库连接有效)。

<小时/>

我不知道为什么这不起作用。我在 destroy 方法中添加了一些日志记录,以确认当应用程序关闭并突然开始工作时它被调用。奇怪。

好的,现在开始以非 servlet 的方式编写它......

最佳答案

根据文档,只有在 servlet 中的所有线程都退出或发生超时后,才会调用 destroy()。因此理论上,除非容器没有正常停止,否则应该始终调用 destroy 。

  1. 验证容器是否正常停止。
  2. destroy() 方法内部没有异常
  3. 尝试在方法的开头记录一些字符串或在其中设置断点 调试器。

此外,如果您使用旧版本的 Tomcat,请注意此 bug

关于java - Servlet 的 destroy 方法没有关闭数据库连接,即使我也告诉过它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10387676/

相关文章:

java - 单次执行后关闭 PreparedStatement——这是设计缺陷吗?

jdbc - Mule 3.3.0 Jdbc 事务意外提交

java - 每个客户端的 Tibco JMS (EMS) TimeToLive?

java - 如何在 Java servlet 方法 init() 中获取本地主机和端口?

java - 编译时错误: package javax. servlet不存在导入javax.servlet.*

java - 当我检索一些数据以在对话框上显示时,JOptionPane.showConfirmDialog 在 netbeans 中不起作用

java - java spring boot 中的 Autowiring beans.groovy

java - 使用 Java 反射更改私有(private)静态最终字段

Java 集合最大 NullPointerException

java - Jboss过滤器无法捕获所有客户端的HTTP请求