簡體   English   中英

實現自定義連接池?

[英]Implement custom connection pool?

我想知道我是否需要實現自己的連接池,什么是高級算法?

我在google上瀏覽了幾個解決方案(鏈接下方),但所有這些解決方案看起來都不適合我。 當我說可擴展時我主要關注getConnection()/borrowConnection()方法,其中我需要確保如果多個線程同時調用此方法,它們不會獲得相同的連接,並且等待也是最小的。 以下所有解決方案都使用同步方法/塊方法,這種方法根本不可擴展,因為在電子商務線程等應用程序中必須等待。

  1. https://codereview.stackexchange.com/questions/40005/connection-pool-implementation
  2. http://www.javaworld.com/article/2076690/java-concurrency/build-your-own-objectpool-in-java-to-boost-app-speed.html
  3. https://sridharrao85.wordpress.com/2011/07/20/sample-connection-pool-implementation/
  4. http://www.javamadesoeasy.com/2015/12/connection-pooling-in-java-with-example.html

我的解決方案: -基本上我的方法專注於如何在粒度級別減少並發性,而不是在持有連接池的數據結構上。 所以我會保留兩個清單(arralylist)

  1. ConnectionsNotInUse
  2. ConnectionInUse

ConnectionsNotInUse將在啟動時保存池中的所有連接(包裝在自定義連接類中)。 現在,如果一個線程要求連接,一旦它成功獲取,它將從ConnectionsNotInUse中刪除它並將其放入ConnectionsInUse。

在每個自定義連接類中,將有方法getConnection()方法,它將使用Semaphore.tryAcquire()獲取鎖,如果有可用並立即返回,值為true。 它將是一個許可證的信號量。 因此,如果線程沒有獲得連接,它將循環遍歷列表中的另一個連接。

如果最后如果線程沒有得到任何連接,如果最大允許限制允許,它將創建另一個連接,否則它將等待連接被釋放。 一旦釋放連接,它就會通知等待連接的線程

有關方法的任何意見/建議嗎?

據我了解你的描述:

連接池的原始實現就像一個只有一個入口的房間,只允許一個人(線程)進入。你擔心的是人會在入口處排隊並影響你的應用程序的可擴展性。 所以你決定有多個入口(免費清單)。 但你似乎沒有說明他們應該嘗試哪個入口,我假設你讓他們嘗試第一個。 如果沒有第一個,他們將嘗試下一個入口。

因此,如果我的理解是正確的,他們選擇的入口政策是績效的核心。 如果他們都先嘗試,那么第二,它與原始實現沒什么區別。

我能想到的快速和無同步方式是散列人的身份。 如果結果入口不再免費,則有兩種方式:

  • 找下一個
    • 再次哈希
    • 下一個職位等
  • 創建新的

所以從隱喻中退出。 我所描述的就像是一個hashmap的實現,您可以通過兩種方式嘗試:

  • 用hashmap替換你的列表
  • 使用與使用和自由連接混合的單個映射,在這種情況下,您可以避免巨型鎖定,但您需要使用ConcurrentHashMap或實現您的版本。

一些通知:

  • 如果你使用兩個由不同線程共享來維護的列表,你仍然需要巨大鎖定它們,否則會崩潰它。
  • 您將增加連接數,以便與最大允許連接進行比較,這也需要同步。

一些建議:

  • 使用原子整數作為計數器
  • 使用ConcurrentHashMap或實現你的版本(實際上它就像一個數組添加鏈表,而數組元素是列表的鎖,避免了巨鎖)

暫無
暫無

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

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