走自己的路

          路漫漫其修遠兮,吾將上下而求索

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            50 隨筆 :: 4 文章 :: 118 評論 :: 0 Trackbacks

          PooledConnectionFactory有兩個屬性maxConnections,maximumActive。咋一看來,用人類的常識理解,maxConnection應該表示最大可建的connection數,maximumActive應該表示最大活躍的connection數,當pool中的連接數大于最大活躍數時,又超過idleTimeout會被回收線程回收到。

          如果是這樣理解的,就大錯特錯了。PooledConnetionFactory的這兩個參數根本不是這個意思。

          看一下PooledConnectionFactory的組成結構:


          注:ConnectionPool其實存儲的就是一個ActivemqConnection,起的名字真是蛋疼。

          更糟的是上面兩個屬性也不是我們想的一樣。maxConnections表示的是LinkedList中connection的數目。maximumActive表示的是SessionPool中session的最大數目。IdleTime是Connection的回收時間,回收時也不是多線程的,每次getConnection時,都會檢測是否超時,如果超時,就是立即回收,此時立即重建,真蛋疼。SeesionPool是用Commons-pool實現的。

          上圖的結構表示的是一個PooledConnetion維護了一個Map,Map的Key可以是由username,password決定的, LinkedList維護了一個循環鏈表的ActivemqConnection。每次從LinkedList中的頭部取出一個AactivemqConnection,然后再添加到尾部,簡單的輪詢式的負載均衡。而這些ActivemqConnection是可以被多線程重用的。Pool實現中也沒有connection是否inactive的檢測機制,因為ActivemqConnection有自己的heartbeat檢測機制。每次發送或接收時候先從ConnectionPool中取出一個connection,如果Connection都用光了,就會重用在鏈表頭部的Connection的SessionPool,所以一個Connection可能會被多個線程使用,但一個session只會對應一個線程,保證上下文隔離性。多線程同享一個物理信道,這需要Activemq有自己的拆包機制,才不會混亂。而上面提到的負載均衡,也沒考慮到session的使用情況,可能我從頭部拿出的connection的session pool已經被耗光,而尾部的connection session pool卻很空閑,這樣就要無辜的阻塞等待session。

          這樣看來在我們設置PooledConnection時,建議有條件的還是需要把maxConnections設置的大一些。它的默認值是1。maximumActive可以設的相對小一些,它的默認值是500,這值太大,擔心內存溢出。IdleTime有條件的可以設置的大一些,增加connection的重用時間,默認值是30秒。



          posted on 2010-11-02 08:55 叱咤紅人 閱讀(11604) 評論(2)  編輯  收藏 所屬分類: Other Java and J2EE frameworks

          評論

          # re: 蛋疼的PooledConnectionFactory(activemq-pool)[未登錄] 2010-11-02 09:38 samuel
          果然是這樣的。汗顏 activemq-pool的設計者。

          不好用,就不用他的了,自己寫一個就是了。  回復  更多評論
            

          # re: 蛋疼的PooledConnectionFactory(activemq-pool) 2013-09-03 12:10 呂春龍
          我還以為就我一個人覺得這個玩意寫的操蛋!遇到知音了!  回復  更多評論
            

          主站蜘蛛池模板: 济源市| 永定县| 吐鲁番市| 康乐县| 伽师县| 潢川县| 山东省| 郎溪县| 舒城县| 曲麻莱县| 康定县| 禄劝| 梓潼县| 乌恰县| 滁州市| 缙云县| 宁明县| 女性| 乌兰浩特市| 松滋市| 昌都县| 玉溪市| 连平县| 东安县| 称多县| 汕头市| 中阳县| 榆林市| 德保县| 柳州市| 龙海市| 宜兰市| 泽库县| 西盟| 岑溪市| 汉阴县| 大冶市| 平利县| 高清| 新巴尔虎右旗| 长治市|