2013-09-22 74 views
8

我剛剛寫了一個使用Akka的JDBC連接池。阿卡什麼時候會帶來更好的表現?

它使用actor來保存真正的數據庫連接的「maxPoolSize」集合。來電者要求游泳池演員進行連接並收到Future[Connection],並且連接的狀態變爲「繁忙」,直到來電者將其返回到connection.close的游泳池。如果所有連接都處於忙碌狀態,則新的傳入連接請求將被放置在等待隊列中(也由池參與者保存)。稍後,當連接返回時,等待請求將被滿足。

這個邏輯的實現在akka中很簡單,只需幾十行代碼。使用BoneCP Multithread Test性能進行測試然而,當(即主叫方的連接時,立即通過getConnection返回Future[Connection]滿足。基準traversed所有close的結果Future請求和Awaitclose),我發現,阿卡版本較慢比許多其他連接池實現,如tomcat-jdbc,BoneCP甚至公共DBCP。

我已經嘗試了調整:

  1. 分裂池演員成多個的每一個容納所有的真正的連接
  2. 調整一些默認調度配置參數(吞吐量,並行)的一部分

但看到沒有明顯的改善。

我的問題是:

  1. 這是一個合適的使用情況,使用阿卡會得到更好的性能?
  2. 如果是這樣,我該如何獲得與那些手工線程連接池實現類似或更好的基準測試數據?
  3. 如果不是,爲什麼?是否有任何既定的標準,可以幫助我決定何時使用akka
+5

我並不感到驚訝。不要懷疑你的發展能力,但這些其他的libs有相當多的開發時間投入他們來解決這個非常具體的問題 – joescii

+0

希望看到#3點的答案! – maasg

+2

我覺得#3在這裏覆蓋得很好:http:// stackoverflow。com/questions/4493001 /良好使用情況下的阿卡 – Ryan

回答

0

另一種方法是創建Router,它會產生幾個從屬角色,每個從屬角色代表一個連接。

但請注意,可能存在潛在的競爭條件。

此外,你正在使用什麼版本的斯卡拉和阿卡?

1

要回答問題#1,這不是Akka在速度上超越的用例。你基本上已經遇到了一個問題,通常通過爲多個讀者和作者優化的併發數據結構來解決這個問題,並通過一個參與者序列化它。

-2

對於高度並行計算,Akka可能是一個很好的選擇,而JDBC連接池不是高度並行計算的好例子。

+0

elcome to stackoverflow!這不提供一個問題的答案。要批評或要求作者澄清,請在其帖子下方留下評論 - 您可以隨時對自己的帖子發表評論,一旦您擁有足夠的聲譽,您就可以對任何帖子發表評論。請閱讀指導好的答案:http://stackoverflow.com/questions/how-to-answer。 – bitoiu

+0

不客氣。 – bitoiu

相關問題