2010-12-23 92 views
2

我創建了一個創建20個線程的測試程序,然後這些線程將打開許多sql連接。比方說,你正在執行這個程序從日食,現在如果你將關閉日食。這會關閉所有打開的sql連接嗎?如果不是,那麼這些會發生什麼?它會在數據庫端顯示100個打開的連接嗎?如果是,那麼在這種情況下該怎麼辦?如果關閉JVM,sql連接會自動關閉嗎?

+0

我認爲在數據庫方面他們會超時。大多數數據庫都有默認的連接超時。 – CoolBeans 2010-12-23 06:40:26

回答

4

連接將不會像撥打java.sql.Connection.close()那樣關閉。基本上,打開連接的JVM不能保持活動的數據庫的TCP/IP連接。這些將立即關閉。因此,「連接」也將被關閉。但是,數據庫可能不會立即做出反應,並保持其會話存活一段時間。

在Oracle中,如果您有足夠的權限,則可以直接殺死數據庫中的會話。

我想,行爲是特定於供應商和/或配置的。沒有普遍的答案。

0

我相信這取決於您使用的數據庫和jdbc驅動程序。我想在大多數情況下,連接將會超時並且將被關閉,但不會立即發生。所以,更好的方法是明確關閉連接。這裏有一些常用的技巧:

  1. 在包裝db連接會話的finally塊中做。
  2. 以防萬一編寫finalize()方法並關閉連接。當連接關閉之前,它將有助於關閉連接,並且連接到數據庫的對象將被垃圾收集。
  3. 您可以創建在進程停止時由JVM自動調用的關閉掛接。這有助於在大多數情況下,當你從外面殺死JVM時(除了kill -9在unix)

順便說一句,我相信你的情況下,你不需要很多連接到數據庫。嘗試重用所有100個線程中的一個。

+0

當進程退出時,內核將關閉所有TCP連接。 -1。 – EJP 2010-12-23 12:14:55

+0

這只是一個創建多個連接的測試,並且所有連接都執行相同的查詢:) – 2010-12-23 13:13:07