0

我最近注意到(通过 jmap+jhat)我的应用程序正在泄漏存储许多实例com.mysql.jdbc.Field 类
- 我仔细检查了我的代码以确保我正在关闭所有 PreparedStatements,发现一些缺失但它并没有改变结果。
- 一些 PreparedStatement 立即创建并关闭
- 其他几个在启动时创建并重复使用多次
- 我org.apache.tomcat.jdbc.pool.DataSource用作连接池

什么会导致这种行为?

4

1 回答 1

1

您是否使用以下方法关闭所有准备好的语句/结果集:

PreparedStatement stmt (possible assignment here);
try
{
 // do all work with prepared statement
 ResultSet rs;
 try
 {
   while (rs.next()) ...
   // process results
 }
 finally
 {
   rs.close();
 }
}
finally
{
  stmt.close();
}

这样您就可以保证所有结果集在完成时都关闭(无论是否有异常)并且所有语句都已关闭(无论是否有异常)?显然还有其他的写法,但想法是一样的。

如果您正确地执行了所有这些操作,那么除非您有太多引用以致占用过多的内存,否则几乎可以肯定,无需对此进行任何操作。

于 2013-05-09T13:03:39.957 回答