sql >> Databáze >  >> RDS >> Mysql

Postupy sdružování připojení JDBC MySql, aby se zabránilo vyčerpání fondu připojení

Výjimka označuje typický případ kódu aplikace, při kterém dochází k úniku databázových připojení. Musíte zajistit, že získáte a zavřete je všechny (Connection , Statement a ResultSet ) v try-with-resources blok ve stejném bloku metody podle normálního idiomu JDBC.

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

Nebo když nepoužíváte Java 7, v try-finally blok. Zavřete je v finally zaručí, že budou uzavřeny i v případě výjimek.

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

Ano, stále musíte uzavřít připojení sami, i když používáte sdružování připojení. Mezi začátečníky je běžnou chybou, že si myslí, že to pak automaticky zvládne zavření. To není pravda . Fond připojení konkrétně vrací zabalené připojení, které v close():

dělá něco jako následující
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();
    }
}

Pokud je neuzavřete, spojení nebude uvolněno zpět do fondu pro opětovné použití, a proto bude znovu a znovu získávat nové, dokud DB nedojde připojení, což způsobí pád vaší aplikace.

Viz také:



  1. Přehled různých uzlů pomocného plánu v PostgreSQL

  2. CodeIgniter:Nelze se připojit k vašemu databázovému serveru pomocí chybové zprávy poskytnutého nastavení

  3. Spuštění balíčku SSIS pomocí dtexec

  4. Vysvětlení JSONB představeného PostgreSQL