Mysql
 sql >> база данни >  >> RDS >> Mysql

Връщане на ResultSet

Никога не трябва да предавате ResultSet наоколо чрез публични методи. Това е предразположено към изтичане на ресурси, защото сте принудени да държите изявлението и връзката отворени. Затварянето им би имплицитно затворило набора от резултати. Но запазването им отворени би ги накарало да се мотаят наоколо и да доведе до изчерпване на ресурсите на БД, когато има твърде много от тях отворени.

Съпоставете го с колекция от Javabeans по този начин и го върнете вместо това:

public List<Biler> list() throws SQLException {
    Connection connection = null;
    PreparedStatement statement = null;
    ResultSet resultSet = null;
    List<Biler> bilers = new ArrayList<Biler>();

    try {
        connection = database.getConnection();
        statement = connection.prepareStatement("SELECT id, name, value FROM Biler");
        resultSet = statement.executeQuery();

        while (resultSet.next()) {
            Biler biler = new Biler();
            biler.setId(resultSet.getLong("id"));
            biler.setName(resultSet.getString("name"));
            biler.setValue(resultSet.getInt("value"));
            bilers.add(biler);
        }
    } finally {
        if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {}
        if (statement != null) try { statement.close(); } catch (SQLException ignore) {}
        if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
    }

    return bilers;
}

Или, ако вече сте на Java 7, просто използвайте опитайте с ресурси оператор, който автоматично ще затвори тези ресурси:

public List<Biler> list() throws SQLException {
    List<Biler> bilers = new ArrayList<Biler>();

    try (
        Connection connection = database.getConnection();
        PreparedStatement statement = connection.prepareStatement("SELECT id, name, value FROM Biler");
        ResultSet resultSet = statement.executeQuery();
    ) {
        while (resultSet.next()) {
            Biler biler = new Biler();
            biler.setId(resultSet.getLong("id"));
            biler.setName(resultSet.getString("name"));
            biler.setValue(resultSet.getInt("value"));
            bilers.add(biler);
        }
    }

    return bilers;
}

Между другото, не трябва да декларирате Connection , Statement и ResultSet като променливи на екземпляра изобщо (основен проблем с безопасността на нишките!), нито да поглъща SQLException в този момент изобщо (повикващият няма да има представа, че е възникнал проблем), нито ще затваря ресурсите в същия try (ако например наборът от резултати close хвърля изключение, тогава операторът и връзката са все още отворени). Всички тези проблеми са коригирани в горните кодови фрагменти.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL – Как да махна таблица, ако съществува в базата данни?

  2. Вмъкване на заявка за вмъкване на редове в MySQL

  3. Изчисляване на размера на InnoDB буферния пул за вашия MySQL сървър

  4. Най-лесният начин да добавите множество интервали към низ в MySQL – SPACE()

  5. Как да избегнем буквалния знак за процент, когато опцията NO_BACKSLASH_ESCAPES е активирана?