簡體   English   中英

將基本數據源與連接池數據源混合:何時調用close()?

[英]mixing basic DataSource with connection pooling DataSource: when to call close()?

我正在將連接池添加到我們的Java應用程序中。

該應用程序可以與不同的rdbmses一起使用,既可以作為桌面應用程序使用,也可以作為無頭Web服務使用。 基本實現在桌面模式下運行良好(rdbms = derby)。 當作為Web服務運行(rdbms = mysql)時,我們看到需要使用連接池來獲得良好的並發行為。

我最初的方法是使用依賴項注入在啟動時決定是基本數據源還是連接池數據源。

在這種情況下的問題是,我不知道何時調用connection.close()。 我的理解是,使用連接池時,應在每個查詢之后關閉(),以便可以回收連接對象。 但是當前的非池化實現嘗試盡可能長時間地掛接到Connection對象。

有解決這個問題的方法嗎? 有沒有辦法回收基本的連接對象? 如果我不使用線程池連接對象調用connection.close()會發生什么?

還是將這兩種連接策略混合在一起只是一個糟糕的設計?

如果我對您的理解正確,那么實際上您是在通過盡可能長時間地保持連接來進行自己的池實現。 如果此策略成功(即程序按照您描述的那樣運行),則您已經擁有了自己的池。 添加池唯一可以使您受益的是改善建立新連接時的響應時間(因為您實際上不會建立連接,因此將從池中獲得連接),這顯然並不會經常發生。

因此,我將回到這個問題的基礎假設:實際上,您的並發性能問題與數據庫池有關嗎? 如果您在MySQL中而不是在Derby中使用事務,那么這可能是導致並發問題的主要原因,例如,另一個潛在原因。

要直接回答您的問題,請始終使用數據庫池。 它們的開銷很小,並且當然可以更改代碼以快速釋放連接(即,在完成請求時,例如,只要用戶沒有打開屏幕,就可以釋放連接),而不是永遠保持連接。

暫無
暫無

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

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