MySQL库导致的Java内存泄漏

MySQL库导致的Java内存泄漏,java,mysql,jdbc,memory-leaks,Java,Mysql,Jdbc,Memory Leaks,我有一个线程,它执行并用一些值更新数据库。我注释掉了对数据所做的所有操作,只留下了下面可以看到的行。当使用下面的代码行运行程序时,我发现内存泄漏 这是VisualVM中的外观 Mysql类 public ResultSet executeQuery(String Query) throws SQLException { statement = this.connection.createStatement(); resultSet = statement

我有一个线程,它执行并用一些值更新数据库。我注释掉了对数据所做的所有操作,只留下了下面可以看到的行。当使用下面的代码行运行程序时,我发现内存泄漏

这是VisualVM中的外观

Mysql类

    public ResultSet executeQuery(String Query) throws SQLException {
        statement = this.connection.createStatement();
        resultSet = statement.executeQuery(Query);
        return resultSet;

    }



    public void executeUpdate(String Query) throws SQLException {
        Statement tmpStatement = this.connection.createStatement();
        
        tmpStatement.executeUpdate(Query);
        tmpStatement.close();
        tmpStatement=null;
        
    }
线程文件

public void run() {
        ResultSet results;
        String query;
        int id;
        String IP;
        int port;
        String SearchTerm;
        int sleepTime;
        while (true) {
            try {

                query = "SELECT * FROM example WHERE a='0'";
                results = this.database.executeQuery(query);

                while (results.next()) {
                    
                    id = results.getInt("id");
                
                    query = "UPDATE example SET a='1' WHERE id='"
                            + id + "'";
                    SearchTerm=null;
                    this.database.executeUpdate(query);
                }
                results.close();
                results = null;
                
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }
很多人在研究了网络之后也遇到了这个问题


如果您在google上搜索“jdbc4resultset内存泄漏”,请确保显式关闭数据库连接。

泄漏是您的,而不是MySQL的。你没有结束声明

你的方法设计得很差。它应该关闭语句,并且应该返回一些在关闭语句后仍然有效的内容,例如
CachedRowSet

否则它就不应该存在。它只有三行,而且不支持查询参数,所以没有多大用处。我会删除它

您似乎还将
语句
作为实例成员,这几乎是不正确的。它应该是本地的方法。目前,您的代码甚至不是线程安全的


您还应该在finally块中关闭
ResultSet
,以确保它被关闭。同上
语句

每个线程如何获取它的
连接
对象?很有可能问题就在这里,每次创建一个新语句都会带来很大的开销。查看
PreparedStatement
以减少开销(处理和网络),提高性能,并提高安全性(自动转义特定于数据库的关键字以防止SQL注入)。看起来您正在泄漏
ResultSet
实例。你可以把它们扔到垃圾堆里,看看它们被抓在哪里。我敢肯定你哪里出了问题。。。我每天使用mysql jdbc 4.0驱动程序(事实上,自从它出现在生产代码中以来,每天使用数千次),并且没有任何已知的由它引起的泄漏。