Mysql
 sql >> Base de données >  >> RDS >> Mysql

Pratiques de regroupement de connexions JDBC MySql pour éviter l'épuisement du pool de connexions

L'exception indique un cas typique de code d'application qui fuit les connexions à la base de données. Vous devez vous assurer que vous acquérez et fermez-les tous (Connection , Statement et ResultSet ) dans un try-with-resources bloc dans le même bloc de méthode selon l'idiome JDBC normal.

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

Ou quand vous n'êtes pas sur Java 7, dans un try-finally bloc. Les fermer en finally garantira qu'ils sont également fermés en cas d'exceptions.

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) {}
    }
}

Oui, vous devez toujours fermer les connexions vous-même, même lorsque vous utilisez le regroupement de connexions. C'est une erreur courante chez les débutants de penser qu'il gérera alors automatiquement la clôture. Ce n'est pas vrai . Le pool de connexions renvoie notamment une connexion encapsulée qui fait quelque chose comme ce qui suit dans le close() :

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

Si vous ne les fermez pas, la connexion ne sera pas renvoyée au pool pour être réutilisée et, par conséquent, elle en acquerra une nouvelle encore et encore jusqu'à ce que la base de données soit à court de connexions, ce qui entraînera le blocage de votre application.

Voir aussi :