Я немного запутался, я читал ниже http://en.wikipedia.org/wiki/Java_Database_Connectivity
Connection conn = DriverManager.getConnection(
"jdbc:somejdbcvendor:other data needed by some jdbc vendor",
"myLogin",
"myPassword" );
Statement stmt = conn.createStatement();
try {
stmt.executeUpdate( "INSERT INTO MyTable( name ) VALUES ( 'my name' ) " );
} finally {
//It's important to close the statement when you are done with it
stmt.close();
}
Не нужно закрывать conn Connection? Что на самом деле происходит, если conn.close () не выполняется?
У меня есть частное веб-приложение, которое я поддерживаю, которое в настоящее время не закрывает ни одну из форм, но действительно ли важным является stmt, conn или оба?
Сайт периодически отключается, но сервер продолжает говорить, что это проблема с подключением к базе данных, я подозреваю, что он не закрывается, но я не знаю, какой из них закрыть.
java
database-connection
onaclov2000
источник
источник
Ответы:
Когда вы закончите использовать свой
Connection
, вам необходимо явно закрыть его, вызвав егоclose()
метод, чтобы освободить любые другие ресурсы базы данных (курсоры, дескрипторы и т. Д.), За которые соединение может держаться.Фактически, безопасный шаблон в Java - закрыть ваши
ResultSet
,Statement
иConnection
(в этом порядке) вfinally
блоке, когда вы закончите с ними, что-то вроде этого:finally
Блок может быть немного улучшен в (чтобы избежать проверок нуля):Но, тем не менее, это чрезвычайно многословно, поэтому вы обычно используете вспомогательный класс для закрытия объектов в нулевых вспомогательных методах, и
finally
блок становится примерно таким:На самом деле в Apache Commons DbUtils есть
DbUtils
класс, который именно этим занимается, поэтому нет необходимости писать свой собственный.источник
rs
,ps
,conn
может быть вnull
зависимости от того, где разрывы кода. Вот почему это известно как «безопасный» шаблон.close
МетодStatement
объекта автоматически закрывает связанныйResultSet
если у оператора есть открытый набор результатов. Аналогичным образом ,close
методConnection
класса закрывает всеStatements
изConnection
.Всегда лучше закрыть объекты базы данных / ресурсов после использования. Лучше закрыть объекты соединения, набора результатов и операторов в
finally
блоке.До Java7 все эти ресурсы нужно было закрывать с помощью
finally
блока. Если вы используете Java 7, то для закрытия ресурсов вы можете сделать следующее.Теперь объекты con, stmt и rs становятся частью блока try, и java автоматически закрывает эти ресурсы после использования.
Надеюсь, я был вам полезен.
источник
ResultSet rs = conn.createStatement().executeQuery(sql);
внутриtry
блока?Достаточно просто закрыть
Statement
иConnection
. Нет необходимости явно закрыватьResultSet
объект.Документация Java говорит о
java.sql.ResultSet
:Спасибо BalusC за комментарии: «Я бы не стал на это полагаться. Некоторые драйверы JDBC терпят неудачу».
источник
Да. Вам нужно закрыть набор результатов, оператор и соединение. Если соединение пришло из пула, его закрытие фактически отправляет его обратно в пул для повторного использования.
Обычно это нужно делать в
finally{}
блоке, так что если возникает исключение, у вас все еще есть возможность закрыть его.Многие фреймворки позаботятся об этой проблеме выделения / освобождения ресурсов за вас. например, Весна JdbcTemplate . В Apache DbUtils есть методы, которые следят за закрытием набора результатов / оператора / соединения, равно нулю или нет (и перехватывая исключения при закрытии), что также может помочь.
источник
На самом деле, лучше всего использовать блок try-with-resources, и Java закроет для вас все соединения, когда вы выйдете из блока try.
Вы должны сделать это с любым объектом, который реализует AutoClosable.
Вызов getDatabaseConnection только что создан. Замените его вызовом, который дает вам соединение JDBC SQL или соединение из пула.
источник
Да, вам нужно закрыть соединение. В противном случае клиент базы данных обычно будет поддерживать соединение сокета и другие ресурсы открытыми.
источник