Является ли закрытие соединения наилучшей практикой?
Возможный дубликат:
Зачем вам реализовывать 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();
}