3 回答

TA貢獻(xiàn)1848條經(jīng)驗 獲得超10個贊
使用連接池時,應(yīng)該最后關(guān)閉連接嗎?如果是這樣,合并的目的就不會丟失嗎?如果不是,那么DataSource如何知道何時釋放Connection的特定實例并可以重用?我對此感到有些困惑,任何指針都表示贊賞。
是的,當(dāng)然您也需要關(guān)閉池化連接。實際上,它是圍繞實際連接的包裝。它會在幕后將實際連接釋放回池中。由池進(jìn)一步?jīng)Q定實際的連接是實際上是關(guān)閉還是重新用于新getConnection()呼叫。因此,無論是否使用連接池,都應(yīng)始終以相反的順序在獲取它們finally的try塊中關(guān)閉所有JDBC資源。在Java 7中,可以通過使用try-with-resourcesstatement 進(jìn)一步簡化此操作。
以下方法是否接近標(biāo)準(zhǔn)?看起來像是嘗試從池中獲取連接,并且如果無法建立DataSource,請使用老式的DriverManager。我們甚至不確定哪個部分在運行時執(zhí)行。重復(fù)以上問題,是否應(yīng)該關(guān)閉這種方法產(chǎn)生的連接?
這個例子很嚇人。您只需要DataSource在應(yīng)用程序啟動期間在整個應(yīng)用程序級數(shù)據(jù)庫配置類的某些構(gòu)造函數(shù)/初始化中查找/初始化一次。然后,只需getConnection()在應(yīng)用程序的整個生命周期中調(diào)用一個相同的數(shù)據(jù)源即可。不需要同步也不需要nullcheck。

TA貢獻(xiàn)1900條經(jīng)驗 獲得超5個贊
池通常返回包裝的Connection對象,在該對象中將覆蓋close()方法,通常將Connection返回到池。調(diào)用close()可以,并且可能仍然需要。
close()方法可能如下所示:
public void close() throws SQLException {
pool.returnConnection(this);
}
對于第二個問題,您可以添加一個記錄器以顯示底部是否運行過。我可以想象,盡管您只希望一種或另一種方式來配置數(shù)據(jù)庫連接。我們僅將池用于數(shù)據(jù)庫訪問。無論哪種方式,關(guān)閉連接對于防止泄漏都是非常重要的。

TA貢獻(xiàn)1877條經(jīng)驗 獲得超1個贊
實際上,連接管理的最佳方法是不要將它們植入任何地方的任何代碼中。
創(chuàng)建一個SQLExecutor類,該類是打開和關(guān)閉連接的唯一位置。
然后,應(yīng)用程序的其余部分將語句泵送到執(zhí)行程序中,而不是從池中獲取連接并在各處進(jìn)行管理(或管理不當(dāng))。
您可以根據(jù)需要擁有任意數(shù)量的執(zhí)行程序?qū)嵗?,但是沒有人可以編寫自己代表打開和關(guān)閉連接的代碼。
方便地,這還使您可以從一組代碼中記錄所有SQL。
添加回答
舉報