簡體   English   中英

Java中有多少個JDBC連接?

[英]How many JDBC connections in Java?

我有一個由大約15種方法組成的Java程序。 並且,在程序的執行期間非常頻繁地調用這些方法。 目前,我正在每個方法中創建一個新連接並在其上調用語句(數據庫在網絡上的另一台機器上設置)。

我想知道的是:我應該在main方法中只創建一個連接,並將其作為參數傳遞給需要連接對象的所有方法,因為它會顯着減少程序中連接對象的數量,而不是創建並且在每種方法中經常關閉連接。

我懷疑我沒有在當前設計中非常有效地使用資源,並且考慮到該程序將來可能會增長很多,因此還有很大的改進空間。

是的,您應該考慮重新使用連接,而不是每次都創建一個新連接。 通常的程序是:

  • 猜測你的數據庫可以合理處理多少個同時連接(例如,在數據庫機器上以每個CPU 2或3開始,直到你發現它太少或太多 - 它往往取決於磁盤的方式 - 你的查詢是)
  • 創建這么多連接的 :本質上是一個類,你可以在每個方法的開頭請求“下一個空閑連接”,然后在每個方法結束時“回傳”到池中
  • 你的getFreeConnection()方法需要返回一個空閑連接(如果有),否則(1)創建一個新連接,最多允許你決定允許的最大連接數,或者(2)如果已經創建了最大連接數,等待一個人獲得自由
  • 我建議使用Semaphore類來管理連接; 我實際上在我的網站上有一篇關於使用Semaphore管理資源池的簡短文章,我想你可以適應你的目的

一些實際考慮因素:

  • 為了獲得最佳性能,您需要注意不要在實際使用它來運行查詢時“占用”連接 如果您從池中獲取一次連接然后將其傳遞給各種方法,則需要確保您不會意外地執行此操作。
  • 不要忘記將您的連接返回游泳池! (嘗試/終於是你的朋友......)
  • 在許多系統中,您無法“永久”保持連接打開 :操作系統將在最長時間后關閉它們。 因此,在“返回與池的連接”方法中,您需要考慮已經存在很長時間的“退休”連接 (構建一些記憶機制,例如通過在實際JDBC周圍設置包裝器對象)可用於存儲此類指標的連接對象)
  • 您可能需要考慮使用預准備語句。
  • 隨着時間的推移,您可能需要調整連接池大小

您可以傳遞連接,也可以更好地使用Jakarta數據庫連接池等。 http://commons.apache.org/dbcp/

您應該使用連接池。

這樣你可以要求連接並在完成后將其釋放並將其返回池中

如果另一個線程想要一個新連接並且正在使用該連接,則可以創建一個新連接。 如果沒有其他線程正在使用連接,則可以重復使用該連接。

這樣你就可以以某種方式離開你的應用程序(而不是四處傳遞連接)並仍然正確地使用資源。

不幸的是,第一類ConnectionPools在獨立應用程序中並不是很容易使用(它們是應用程序服務器中的默認設置)可能是一個微容器(如Sping)或一個好的框架(如Hibernate)可以讓你使用它。

盡管如此,從頭開始編寫代碼並不難。

:)

此谷歌搜索將幫助您找到有關如何使用它的更多信息。

快速瀏覽

許多JDBC驅動程序會為您執行連接池,因此在這種情況下執行其他池的優勢很小。 我建議你查看JDBC驅動程序的文檔。

連接池的另一種方法是

  • 通過同步訪問為所有數據庫訪問建立一個連接。 這不允許並發,但非常簡單。
  • 將連接存儲在ThreadLocal變量中(覆蓋initialValue())如果存在少量固定數量的線程,則此方法很有效。

否則,我建議使用連接池。

如果您的應用程序是單線程的,或者從單個線程執行所有數據庫操作,則可以使用單個連接。 假設您出於任何其他原因不需要多個連接,這將是迄今為止最簡單的實現。

根據您的驅動程序,在線程之間共享連接也是可行的 - 如果您相信您的驅動程序不要對其線程安全性撒謊,這也可以。 有關詳細信息,請參閱驅動程序文檔

通常,“連接”下面的對象不能安全地從多個線程中使用,因此通常不建議在線程之間共享ResultSet,Statement對象等 - 到目前為止,最好的策略是在創建它們的同一線程中使用它們; 這通常很容易,因為這些物體一般不會保存太久。

暫無
暫無

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

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