Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Praktyki pulowania połączeń JDBC MySql w celu uniknięcia wyczerpania puli połączeń

Wyjątek wskazuje na typowy przypadek kodu aplikacji, który przecieka połączenia z bazą danych. Musisz upewnić się, że zdobędziesz i zamknij je wszystkie (Connection , Statement i ResultSet ) w try-with-resources blok w tym samym bloku metody zgodnie z normalnym idiomem 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();
    }
}

Lub gdy nie korzystasz z Javy 7, w try-finally blok. Zamknięcie ich w finally zagwarantuje, że zostaną one również zamknięte w przypadku wyjątków.

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

Tak, nadal musisz samodzielnie zamykać połączenia, nawet podczas korzystania z puli połączeń. Jest to powszechny błąd wśród początkujących, którzy myślą, że wtedy automatycznie obsłuży zamknięcie. To nieprawda . Pula połączeń, a mianowicie zwraca opakowane połączenie, które wykonuje coś takiego w 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();
    }
}

Niezamknięcie ich spowoduje, że połączenie nie zostanie zwolnione z powrotem do puli w celu ponownego użycia, a tym samym będzie uzyskiwać nowe, dopóki DB nie wyczerpie się połączeń, co spowoduje awarię aplikacji.

Zobacz też:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JSON_CONTAINS() Przykłady w MySQL

  2. Konfiguracje wielu centrów danych przy użyciu klastra Galera dla MySQL lub MariaDB

  3. Eksportujesz wyniki zapytania Mysql do programu Excel?

  4. Jak przechowywać dane w Unicode w języku hindi?

  5. Odzyskiwanie dostępu do utraconego hasła MySQL dla PHPMyAdmin na WAMP