2012-12-20 2 views
1

Предположим, что я получил PreparedStatement от объекта Connection, а затем я переписал ссылку другим PreparedStatement. Затем, позже, I close() ссылка. Останутся ли первые PreparedStatement (тот, который я потерял ссылку)? Или какой-то протокол или сбор мусора позаботится об этом?Является ли PreparedStatement «открытым», если ссылка перезаписана?

Например:

PreparedStatement ps = connection.prepareStatement(MY_QUERY); 
// do stuff 
ps.execute(); 

ps = connection.prepareStatement(MY_OTHER_QUERY); 
// do stuff 
ps.execute(); 

ps.close(); 

ли первый PreparedStatement объект, который используется для выполнения MY_QUERY, остается открытым?

+0

http://stackoverflow.com/questions/8652336/jdbc-garbage-collection –

ответ

7

Да, PreparedStatement будет оставлен открытым до тех пор, пока не будет получен сбор мусора * (если вообще).

Именно поэтому вы всегда видите правило до Всегда выпускайте (закрыть) внешние ресурсы, приобретенные вами.

Ресурсы JDBC (такие как этот подготовленный оператор, соединения, наборы результатов) и ресурсы IO (сокеты, потоки, ...) являются двумя наиболее распространенными ресурсами, которые вам необходимо вручную управлять на Java.

* строго говоря может быть закрыта в finalize метод, который может быть немного раньше он получает GCed, но после он получает право на GC, но для этого обсуждения этого достаточно близко.

+1

Я думаю, что ваше последнее замечание смущает блок finally с помощью метода finalize. – bowmore

+0

+1 Если мы используем try с блоком ресурсов, введенным в java 7, PreparedStatement будет автоматически закрыт. –

+0

@bowmore: конечно. Я использую 'finalize' так редко, что я даже ошибаюсь. –

1

Он будет закрыт, когда объект будет в конечном итоге собранным мусором. Поскольку у вас мало контроля над процессом сбора мусора, рекомендуется закрыть инструкции, как только вы закончите с ними.

Из документации для Statement.close():

Релизы базы данных это заявление, объекта и JDBC ресурсы немедленно, а не ждать, чтобы это произошло, когда он автоматически закрывается. Как правило, хорошей практикой является выпуск ресурсов, как только вы закончите с ними, чтобы не связывать ресурсы базы данных.

1

Он останется открытым, и нет гарантии, что он будет закрыт при сборке мусора. Это зависит от реализации. Реализация должна переопределить финализацию, например, в файле FileInputStream.finalize, который

«... гарантирует, что метод закрытия этого потока ввода файла вызывается, когда на нем больше нет ссылок».

Но connection.close может закрыть PreparedStatement см API для connection.close:

«..releases ресурсы базы данных и JDBC этого объекта Connection сразу, а не ждать, пока они будут автоматически освобождены ..»

, но только если он не объединен.

+0

Итак, если «Соединение», из которого подготовлено 'PreparedStatement', закрыто, оно закроет все те (потерянные) объекты' PreparedStatement'? – asteri

+0

Да, это будет, также DB выпустит все ресурсы, занятые сеансом/соединением при закрытии. Но это может быть не для объединенных соединений, потому что они игнорируют close() –

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