Hello,

I'm using Tomcat 7.0.34 via TomEE 1.5.1 with MySQL. I noticed a memory leak in my web application which uses jdbc connection pooling with Tomcat's jdbc-pool.

The com.mysql.jdbc.JDBC4Connection class has a field named "openStatements" which holds, as you can imagine, open sql statements. This structure grows continuously over time and no statements are ever released. I stepped into my code to verify that I closed opened statements and it is the case.

Digging some more, I downloaded Tomcat's source and it seems that jdbc-pool discards all calls to java.sql.Statement.close() in StatementDecoratorInterceptor#invoke(Object proxy, Method method, Object[] args)

I see what could be a bug in StatementCache#closeInvoked() which is called by the above method. Here is the code with my own comments added:
@Override
public void closeInvoked() {
    boolean shouldClose = true;
    if (cacheSize.get() < maxCacheSize) {
        // omitted for brievety
    }
    closed = true;
    // [1] I think "delegate = null" is done too soon
    delegate = null;
    if (shouldClose) {
        // check its body below
        super.closeInvoked();
    }
}

// This is super.closeInvoked()
public void closeInvoked() {
    if (getDelegate()!=null) {
        // never true when coming from
        // StatementCache#closeInvoked()
        // because of [1]
        try {
            getDelegate().close();
        }catch (SQLException ignore) {
        }
    }
    closed = true;
    delegate = null;
}

Regards,
Bertrand

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to