java - Tomcat 提示由于 JDBC 驱动程序关闭后打开连接导致内存泄漏

标签 java mysql apache tomcat

我有一个 Servlet,它重写了 init() 方法,如下所示:

@Override
public void init() throws ServletException {
    BookDAO bookDAO = new BookDAOImpl();
    List<Category> categoryList = bookDAO.findAllCategories();
    getServletContext().setAttribute("categoryList", categoryList);
}

BookDAO#findAllCategories 是:

@Override
public List<Category> findAllCategories() {

    List<Category> result = new ArrayList<>();
    String sql = "select * from category";

    Connection connection = null;

    try {
        connection = getConnection();
        PreparedStatement statement = connection.prepareStatement(sql);
        ResultSet resultSet = statement.executeQuery();
        while (resultSet.next()) {
            Category category = new Category();
            category.setId(resultSet.getLong("id"));
            category.setCategoryDescription(resultSet
                    .getString("category_description"));
            result.add(category);
        }
    } catch (SQLException ex) {
        ex.printStackTrace();
    } finally {
        closeConnection(connection);
    }

    return result;

}

我只是点击了这个 servlet,它就被加载了。在数据库方面没有别的。当我关闭 Tomcat 时,我得到:

02-Oct-2014 22:29:45.182 INFO [main] org.apache.catalina.core.StandardService.stopInternal Stopping service Catalina
02-Oct-2014 22:29:45.189 SEVERE [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoader.clearReferencesJdbc The web application [/bookwebapp] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
02-Oct-2014 22:29:45.190 SEVERE [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoader.clearReferencesThreads The web application [/bookwebapp] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak.
02-Oct-2014 22:29:45.190 SEVERE [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoader.clearReferencesThreads Stack trace of thread "Abandoned connection cleanup thread":
 java.lang.Object.wait(Native Method)
 java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:142)
 com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:43)
02-Oct-2014 22:29:45.191 INFO [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"]
02-Oct-2014 22:29:45.193 INFO [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["ajp-nio-8009"]
02-Oct-2014 22:29:45.193 INFO [main] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"]
02-Oct-2014 22:29:45.194 INFO [main] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["ajp-nio-8009"]
Disconnected from server

我缺少什么?

最佳答案

看来您遇到了这个问题:

tomcat7 - jdbc datasource - This is very likely to create a memory leak

具体来说,您将 jdbc 驱动程序作为 war 的一部分而不是 tomcat lib 文件夹。

关于java - Tomcat 提示由于 JDBC 驱动程序关闭后打开连接导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26168292/

相关文章:

php - 如何正确安装LAMP软件包?

java - 如何将 Apache 引向 Vaadin (Java) 项目?

reload - Apache HTTPD 重新加载

java - 无法读取未定义的属性 MyToast.java

JavaFX Tableview 按升序对底部为 null 的 java.sql.Date 列进行排序

java - 通过 PHP 将数据 + 图像从 android 插入到 mysql 不工作

php - 如何以 .JSON 文件格式存储 MySQL 数据?

php - 我想对members表中的每个成员进行SQL查询

java - 访问日志中的奇怪请求导致 IllegalArgumentException

php - MySQL CURRENT_TIMESTAMP 字段在每次更新时更新