iordanis
iordanis

Reputation: 1284

Java memory leak caused by MySQL libraries

I have a thread that executes and updates a database with some values. I commented out all the operations done to the data and just left the lines you can see below. While running the program with the lines you see bellow I get a memory leak.

This is what it looks like in VisualVM

enter image description here enter image description here Mysql Class

    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;
        
    }

Thread file

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();
            }
        }

    }

The problem has happened with many other people after researching the web,

https://forum.hibernate.org/viewtopic.php?f=1&t=987128

Is bone cp or mysql.jdbc.JDBC4Connection known for leaking?

and a few more if you google "jdbc4resultset memory leak"

Upvotes: 2

Views: 1856

Answers (2)

user207421
user207421

Reputation: 311050

The leak is yours, not MySQL's. You aren't closing the statement.

The design of your method is poor. It should close the statement, and it should return something that will survive closing of the statement, such as a CachedRowSet.

Or else it should not exist at all. It's only three lines, and it doesn't support query parameters, so it isn't really much use. I would just delete it.

You also appear to have statement as an instance member, which is rarely if ever correct. It should be local to the method. At present your code isn't even thread-safe.

You should also be closing the ResultSet in a finally block to ensure it gets closed. Ditto the Statement.

Upvotes: 7

Xavier J
Xavier J

Reputation: 4728

Make sure that you are explicitly closing the database connections.

Upvotes: 2

Related Questions