sql >> Database teknologi >  >> RDS >> Mysql

JDBC MySql-forbindelsespooling praktiserer for at undgå opbrugt forbindelsespulje

Undtagelsen angiver et typisk tilfælde af applikationskode, som lækker databaseforbindelser. Du skal sikre dig, at du erhverver og luk dem alle (Connection , Statement og ResultSet ) i en try-with-resources blok i den samme metodeblok i henhold til det normale JDBC-formsprog.

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

Eller når du ikke er på Java 7, i en try-finally blok. Luk dem ind finally vil garantere, at de også er lukket i tilfælde af undtagelser.

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, du skal stadig selv lukke forbindelser, selv når du bruger forbindelsespooling. Det er en almindelig fejl blandt startere, at de tror, ​​at den så automatisk vil klare lukningen. Dette er ikke sandt . Forbindelsespuljen returnerer nemlig en indpakket forbindelse, som gør noget i stil med følgende i 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();
    }
}

Hvis du ikke lukker dem, vil forbindelsen ikke blive frigivet tilbage til puljen til genbrug, og den vil derfor erhverve en ny igen og igen, indtil DB løber tør for forbindelser, hvilket vil få din applikation til at gå ned.

Se også:



  1. Sådan fungerer QUARTER() i MariaDB

  2. Beregn alderen i år i PostgreSQL

  3. MySQL LIMIT-klausul svarer til SQL SERVER

  4. Sådan sammenlignes to tabeller kolonne for kolonne i orakel