Mysql
 sql >> Datenbank >  >> RDS >> Mysql

JDBC MySql-Verbindungspooling-Praktiken, um einen erschöpften Verbindungspool zu vermeiden

Die Ausnahme weist auf einen typischen Fall von Anwendungscode hin, der Datenbankverbindungen verliert. Sie müssen sicherstellen, dass Sie und erwerben schließen Sie alle (Connection , Statement und ResultSet ) in einem try-with-resources block im selben Methodenblock gemäß dem normalen JDBC-Idiom.

public void create(Entity entity) throws SQLException {
    try (
        Connection connection = dataSource.getConnection();
        PreparedStatement statement = connection.prepareStatement(SQL_CREATE);
    ) { 
        statement.setSomeObject(1, entity.getSomeProperty());
        // ...
        statement.executeUpdate();
    }
}

Oder wenn Sie nicht auf Java 7 sind, in einem try-finally Block. Schließen Sie sie in finally garantiert, dass sie auch im Ausnahmefall geschlossen werden.

public void create(Entity entity) throws SQLException {
    Connection connection = null;
    PreparedStatement statement = null;

    try { 
        connection = dataSource.getConnection();
        statement = connection.prepareStatement(SQL_CREATE);
        statement.setSomeObject(1, entity.getSomeProperty());
        // ...
        statement.executeUpdate();
    } finally {
        if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
        if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
    }
}

Ja, Sie müssen Verbindungen immer noch selbst schließen, auch wenn Sie Verbindungspooling verwenden. Es ist ein häufiger Fehler unter Startern, dass sie denken, dass es dann automatisch das Schließen handhabt. Das ist nicht wahr . Der Verbindungspool gibt nämlich eine umschlossene Verbindung zurück, die in close() etwa Folgendes tut:

public void close() throws SQLException {
    if (this.connection is still eligible for reuse) {
        do not close this.connection, but just return it to pool for reuse;
    } else {
        actually invoke this.connection.close();
    }
}

Sie nicht zu schließen, würde dazu führen, dass die Verbindung nicht zur Wiederverwendung an den Pool freigegeben wird und daher immer wieder eine neue erhält, bis die DB keine Verbindungen mehr hat, was zum Absturz Ihrer Anwendung führt.

Siehe auch: