[英]Implement custom connection pool?
我想知道我是否需要實現自己的連接池,什么是高級算法?
我在google上瀏覽了幾個解決方案(鏈接下方),但所有這些解決方案看起來都不適合我。 當我說可擴展時我主要關注getConnection()/borrowConnection()
方法,其中我需要確保如果多個線程同時調用此方法,它們不會獲得相同的連接,並且等待也是最小的。 以下所有解決方案都使用同步方法/塊方法,這種方法根本不可擴展,因為在電子商務線程等應用程序中必須等待。
我的解決方案: -基本上我的方法專注於如何在粒度級別減少並發性,而不是在持有連接池的數據結構上。 所以我會保留兩個清單(arralylist)
ConnectionsNotInUse將在啟動時保存池中的所有連接(包裝在自定義連接類中)。 現在,如果一個線程要求連接,一旦它成功獲取,它將從ConnectionsNotInUse中刪除它並將其放入ConnectionsInUse。
在每個自定義連接類中,將有方法getConnection()方法,它將使用Semaphore.tryAcquire()
獲取鎖,如果有可用並立即返回,值為true。 它將是一個許可證的信號量。 因此,如果線程沒有獲得連接,它將循環遍歷列表中的另一個連接。
如果最后如果線程沒有得到任何連接,如果最大允許限制允許,它將創建另一個連接,否則它將等待連接被釋放。 一旦釋放連接,它就會通知等待連接的線程
有關方法的任何意見/建議嗎?
據我了解你的描述:
連接池的原始實現就像一個只有一個入口的房間,只允許一個人(線程)進入。你擔心的是人會在入口處排隊並影響你的應用程序的可擴展性。 所以你決定有多個入口(免費清單)。 但你似乎沒有說明他們應該嘗試哪個入口,我假設你讓他們嘗試第一個。 如果沒有第一個,他們將嘗試下一個入口。
因此,如果我的理解是正確的,他們選擇的入口政策是績效的核心。 如果他們都先嘗試,那么第二,它與原始實現沒什么區別。
我能想到的快速和無同步方式是散列人的身份。 如果結果入口不再免費,則有兩種方式:
所以從隱喻中退出。 我所描述的就像是一個hashmap的實現,您可以通過兩種方式嘗試:
一些通知:
一些建議:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.