2014-10-17 2 views
0

Я пишу код на Java, который включает в себя базы данных (SQLite), и я новичок в нем, поэтому мне нужна помощь с этим. Мой код выглядит следующим образом:Утечка ресурсов Java в PreparedStatement

Connection connection = null; 
try { 
    connection = SQLiteConnector.getConnection(database Name); 
    PreparedStatement prepStat = connection.prepareStatement("some SQL stuff"); 
    ResultSet result= prepStat.executeQuery(); 
    // Use of result 

    if (condition1){ 

     prepStat = connection.prepareStatement("some SQL stuff"); 
     result = prepStat.executeQuery(); 
     // Another use of result 

     if (condition2){ 
      prepStat = connection.prepareStatement("some SQL stuff"); 
     } 
     else{ 
      prepStat = connection.prepareStatement("some SQL stuff"); 
     } 

     result = prepStat.executeQuery(); 
     // Use of result 

     result.close(); 
     prepStat.close(); 
    } 
} catch (Exception e) { 
    // Exception management 
} 
finally{ 
    SQLiteConnector.closeConnection(connection); 
} 

И я получаю исключение, говоря: «утечки ресурсов:„стат“не замкнута в этом месте» в еще блока. Как мне его реорганизовать?

Спасибо заранее

+0

Опубликуйте стек и выберите линию, которая его выбрасывает. Или это ошибка времени компиляции? – wvdz

+0

Сообщение об утечке ресурсов - это только предупреждение - ваш код все равно будет компилироваться и запускаться, если вы не решите проблему. Предполагая, что вы имели в виду 'prepStat', а не' stat', предупреждение отображается в строке 'prepStat.close();' или около того? Кроме того, какую версию JDK вы используете? – JonK

+1

Вы не выглядите '.close()' первым ''prepStat', не так ли? – fge

ответ

1

PreparedStatements всегда должен быть явно закрыт в JDBC. Общая схема использования PreparedStatement:

  • Создайте заявление.
  • Задайте параметры и выполните их.
  • Задайте различные параметры и выполните их.
  • Задайте еще несколько параметров и выполните их.
  • Закройте заявление.

С самого начала Java 7 самый простой способ гарантировать, что вы всегда это делаете правильно, - использовать инструкцию в блоке try with resources.

0

Вы не закрыли prepStat перед повторным использованием. Также попытайтесь закрыть оператор в блоке finally, а не пытаться, поскольку он может оставить закрытые заявления незакрытыми.

if (condition1){ 

    prepStat = connection.prepareStatement("some SQL stuff"); 
    result = prepStat.executeQuery(); 
    // Another use of result 

    prepStat.close(); //close the statement 

    if (condition2){ 
     prepStat = connection.prepareStatement("some SQL stuff"); 
    } 
    else{ 
     prepStat = connection.prepareStatement("some SQL stuff"); 
    } 

    result = prepStat.executeQuery(); 
    // Use of result 

    result.close(); 
    prepStat.close(); 
} 
1

Используйте отдельные переменные, определенно попробуйте с ресурсами.

try (PreparedStatement prepStat = 
      connection.prepareStatement("some SQL stuff"); 
      ResultSet result = prepStat.executeQuery()) { 
     ... 
     try (PreparedStatement prepStat2 = 
       connection.prepareStatement(condition2 ? "some SQL stuff" : "some SQL stuff") { 
      try (ResultSet result2 = prepStat.executeQuery(); 
       // Use of result2 
      } 
     } 
    } 

Затем все красиво закрыто, даже с исключением или оператором возврата.

Смежные вопросы