sql >> Database >  >> RDS >> Mysql

JDBC MySql-verbindingspoolingpraktijken om een ​​uitgeputte verbindingspool te voorkomen

De uitzondering duidt op een typisch geval van toepassingscode die databaseverbindingen lekt. U moet ervoor zorgen dat u en . verwerft sluit ze allemaal (Connection , Statement en ResultSet ) in een try-with-resources blok in dezelfde methode blok volgens het normale JDBC-idioom.

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

Of als je niet op Java 7 zit, in een try-finally blok. Ze sluiten in finally zal garanderen dat ze ook gesloten zijn in geval van uitzonderingen.

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, je moet nog steeds zelf verbindingen afsluiten, ook als je gebruikmaakt van pooling van verbindingen. Het is een veelgemaakte fout onder starters dat ze denken dat het dan automatisch de afsluiting afhandelt. Dit is niet waar . De verbindingspool retourneert namelijk een ingepakte verbinding die zoiets als het volgende doet in de 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();
    }
}

Als u ze niet sluit, wordt de verbinding niet vrijgegeven aan de pool voor hergebruik en krijgt deze dus steeds weer een nieuwe totdat de DB geen verbindingen meer heeft, waardoor uw toepassing vastloopt.

Zie ook:



  1. Gegevensgeneratoren voor SQL-server?

  2. Verwijder of trim de eerste of laatste paar tekens in MySQL-database met SQL

  3. Hoe kan ik overschakelen van de SQL Server Windows-modus naar de gemengde modus (SQL Server 2008)?

  4. SQL-injectie in Node.js voorkomen