Tomcat-JDBC-Verbindungspool-Problem: "Anweisung ist geschlossen"

Ich habe eine Serveranwendung, die den Tomcat JDBC-Verbindungspool verwendet.

Dies ist der Code, den ich zum Erstellen der DataSource verwende:

PoolProperties connProperties = new PoolProperties();
connProperties.setUrl(resources.getProperty("db.url"));
connProperties.setDriverClassName(resources.getProperty("db.driver"));
connProperties.setUsername(resources.getProperty("db.user"));
connProperties.setPassword(resources.getProperty("db.password"));
connProperties.setJmxEnabled(true);
connProperties.setTestWhileIdle(false);
connProperties.setValidationQuery("SELECT 1");
connProperties.setTestOnReturn(false);
connProperties.setValidationInterval(30000);
connProperties.setTimeBetweenEvictionRunsMillis(30000);
connProperties.setMaxActive(500);
connProperties.setInitialSize(50);
connProperties.setMaxWait(10000);
connProperties.setRemoveAbandonedTimeout(60);
connProperties.setMinEvictableIdleTimeMillis(60000);
connProperties.setSuspectTimeout(60);
connProperties.setMaxIdle(50);
connProperties.setMinIdle(10);
connProperties.setLogAbandoned(false);
connProperties.setRemoveAbandoned(true);
connProperties.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+
"org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");

dataSource = new DataSource();
dataSource.setPoolProperties(connProperties); 

Dann habe ich eine Methode, um eine Verbindung aus dem Pool zu erhalten

protected Connection getDbConnection() throws Exception
{
    dbConn = dataSource.getConnection();
    return dbConn;
}

Und jedes Mal, wenn ich eine Anweisung ausführen möchte, rufe ich diesen Code auf:

protected CallableStatement executeCSqlQuery(String sql) throws Exception
{
    CallableStatement cstmt;
    ResultSet rs = null;

    try {
        cstmt = getDbConnection().prepareCall(sql);     
        cstmt.execute();            
    } catch (SQLException e) {
        throw e;
    }

    return cstmt;
}

Und dies ist ein Beispiel für einen Aufruf des vorherigen Codes:

try {
    cstmt = dbConnection.executeCSqlQuery(query);
    rs = cstmt.getResultSet();
} catch (Exception e) {
    // do smething
} finally {
    try {
        if (cstmt != null) {
            cstmt.close();
        }
        dbConnection.shutdown();
    } catch (Exception e) {
        // do something
    }
}

public void shutdown() {
    if (this.dbConn != null) 
        this.dbConn.close();
}

Das Problem, mit dem ich konfrontiert bin, ist, dass ich von Zeit zu Zeit die Ausnahme "Anweisung ist geschlossen" erhalte, wenn ich alle X Sekunden einen Aufruf in einem Thread ausführe. Ich bin mir nicht sicher, warum das passiert. Ich denke, dass es ein Treiberfehler oder etwas sein könnte, das mit der Verbindung zur Datenbank ausfällt (die in einem anderen Bediener läuft).

Ich habe keine Ideen mehr. Was vermisse ich?

Sollte ich es benutzenc3p0 Verbindungspool statt?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage