所以我有一个 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 。
- 验证容器是否正常停止。
- destroy() 方法内部没有异常
- 尝试在方法的开头记录一些字符串或在其中设置断点 调试器。
此外,如果您使用旧版本的 Tomcat,请注意此 bug
关于java - Servlet 的 destroy 方法没有关闭数据库连接,即使我也告诉过它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10387676/