簡體   English   中英

如何改進此連接池設計?

[英]How to improve on this connection pool design?

首先,我正在開發自己的DBCP(數據庫連接池)實現,

我不會接受使用c3p0之類的第三方DBCP的任何建議。

我將生產者-消費者設計模型用作DBCP的主要設計模板。

             PRODUCER | CONSUMER
Pn, ... P3, P2, P1 >>   << C1, C2, C3, ... Cn

對於生產者和消費者,我都使用LinkedList隊列。

生產者隊列

將由最大數量的SQLConnectionWrapper實例填充。 我已采取步驟確保連接在隊列中是唯一的。 在.close()之后,連接將

  • 首先,刪除C隊列中的第一個元素(如果有),
  • 否則,排入P-Queue。

我使用管家線程來刪除隊列中的陳舊/過期的連接,並生成新的連接以保持配置的最小連接數。

消費者隊列

它將由FutureTask實例填充。 使用我的DBCP的應用會調用

Connection conn = dbcp.getConnection(long timeout);

這將,

  • 首先創建一個Consumer FutureTask,
  • 刪除P隊列中的第一個元素(如果有),
  • 否則,排隊進入C隊列,
  • 阻塞.get(timeout)直到它被生產者“喂”或超時(以先到者為准)。

我的問題

這種設計可以進一步改進嗎? 有什么明顯的缺點嗎?

我的首要任務是在並發使用環境中保持穩定性。 我從當前的測試中了解到,由於涉及2個隊列,因此需要雙方同步。

目前,我正在探索以下想法:

  • 將2個隊列減少為1個雙端隊列(盡管我很難考慮如何使P端消滅C端)
  • 創建一個同步的殲滅者線程,從而無需PRODUCER和CONSUMER相互檢查。

既然您已經說過,您將不接受任何第三方資源池建議。 我想你的意思是任何第三方連接池。

您可以看到的類似於apache commons連接池 ,它為任何對象提供池化功能。 因此,雖然我的意思不是冒犯,也不想讓你失望,但我認為你正在嘗試重新發明方向盤。

話雖如此,上面的鏈接提供了通用池的非常高級的設計。 檢查如何使用游泳池,您將對發生的事情有一個清晰的認識,也將對您的設計有所幫助。

暫無
暫無

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

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