Является ли закрытие соединения наилучшей практикой?

Возможный дубликат:
Зачем вам реализовывать finalize()?

Я видел несколько файлов Java со следующим кодом:

public void finalize() {
    if (conn != null) {
        try {
            conn.close();
        } catch (SQLException e) {
        }
    }
}
  • Закрывает Connection в finalize метод лучшей практики?
  • Достаточно ли закрыть Connection или нужно также закрыть другие объекты, такие как PreparedStatement?

4 ответа

Решение

Начиная с Java 7, лучшим способом закрытия ресурса является использование try-with-resource:

http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

Нет, это не "лучшая практика" или даже "сносная практика". У вас нет гарантии, когда будут вызваны финализаторы, так что это не сработает.

Вместо этого вы должны распределить ресурсы по блоку, например так:

try {
  acquire resource
}
finally {
  if (resource was acquired)
    release it
}

Нет, финализатор вряд ли будет вызван своевременно, если вообще когда-либо. Очистите свои ресурсы явно и обязательно.

/* Acquire resource. */
try {
  /* Use resource. */
}
finally {
  /* Release resource. */
}

Как только объект Connection получен, используйте его для выполнения PreparedStatement/Statement/CallableStatement, который помещен в блок try, затем поместите задания по уборке дома, такие как закрытие statment и conn.

например:

 try{

    Connection conn = DriverManager.getConnection(url,username,password);

    PreparedStatement pStat = conn.prepareStatement("Drop table info");

    pStat.executeUpdate();
      }
       catch(Exception ex){
        }

   finally(){

     pStat.close();
     conn.close();
 }
Другие вопросы по тегам