簡體   English   中英

JDBC連接關閉和PreparedStatement關閉

[英]Jdbc connection close and preparedstatement close

大家好,我知道這是一個老問題,但今天只是好奇。 我們知道connection.close也會關閉prepareStatement(如果我錯了,請糾正我)。 但是如果我關閉連接然后關閉prepareStatement,該怎么辦

conn.close();
ps.close();

我會得到一個nullpointer異常嗎?

有人說這取決於您的jvm速度。有時ps.close()會先運行並先關閉,然后conn.close完成工作,這樣您就不會得到nullpointer。

為了測試,我修改了代碼

conn.close();
Thread.sleep(5000);//I give 5s to conn.close to finish his work. should be enough
ps.close();

但是我沒有得到空指針。

所以我的問題是,如果我先關閉conn然后再關閉ps,這里會發生什么。

謝謝大家

用於Statement.close()的JavaDoc指出:

在已關閉的Statement對象上調用close方法無效。

我建議這意味着,如果您的語句已經被Connection.close()調用關閉,則實現不應拋出異常。

根據語句接口的javadoc

close
void close()
           throws SQLExceptionReleases this Statement object's database and JDBC resources immediately instead of waiting for this to happen when it is automatically closed. It is generally good practice to release resources as soon as you are finished with them to avoid tying up database resources. 
**Calling the method close on a Statement object that is already closed has no effect.** 

因此,如果您關閉一個已經關閉的Statement不會有任何問題。

該行為特定於驅動程序實現或連接池實現。 它們基本上裝飾了基礎的連接/聲明/結果集並跟蹤其狀態。 因此,實現可以選擇在關閉主要對象之前先關閉依賴對象。 Primrose連接池用於在Connection上調用close()方法時打印有關未結束語句或結果的警告(該方法被重寫以將連接返回到池)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM