`
ldd600
  • 浏览: 101891 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
47bb354f-8b5f-3ea6-a206-c7ead38c741c
Hyperic插件开发不完...
浏览量:11085
社区版块
存档分类
最新评论

蛋疼的PooledConnectionFactory(activemq-pool)

阅读更多

PooledConnectionFactory有两个属性maxConnectionsmaximumActive。咋一看来,用人类的常识理解,maxConnection应该表示最大可建的connection数,maximumActive应该表示最大活跃的connection数,当pool中的连接数大于最大活跃数时,又超过idleTimeout会被回收线程回收到。

 

如果是这样理解的,就大错特错了。PooledConnetionFactory的这两个参数根本不是这个意思。

看一下PooledConnectionFactory的组成结构:

 


 

注:ConnectionPool其实存储的就是一个ActivemqConnection,起的名字真是蛋疼。

更糟的是上面两个属性也不是我们想的一样。maxConnections表示的是LinkedListconnection的数目。maximumActive表示的是SessionPoolsession的最大数目。IdleTimeConnection的回收时间,回收时也不是多线程的,每次getConnection时,都会检测是否超时,如果超时,就是立即回收,此时立即重建,真蛋疼。SeesionPool是用Commons-pool实现的。

 

上图的结构表示的是一个PooledConnetion维护了一个MapMapKey可以是由usernamepassword决定的, LinkedList维护了一个循环链表的ActivemqConnection。每次从LinkedList中的头部取出一个AactivemqConnection,然后再添加到尾部。而这些ActivemqConnection是可以被多线程重用的。Pool实现中也没有connection是否inactive的检测机制,因为ActivemqConnection有自己的heartbeat检测机制。每次发送或接收时候先从ConnectionPool中取出一个connection,如果Connection都用光了,就会重用在链表头部的ConnectionSessionPool,所以一个Connection可能会被多个线程使用,但一个session只会对应一个线程,保证上下文隔离性。多线程同享一个物理信道,这需要Activemq有自己的拆包机制,才不会混乱。

 

这样看来在我们设置PooledConnection时,建议有条件的还是需要把maxConnections设置的大一些。它的默认值是1maximumActive可以设的相对小一些,它的默认值是500,这值太大,担心内存溢出。IdleTime有条件的可以设置的相对大一些,增加connection的重用时间,默认值是30秒。

  • 大小: 23.6 KB
0
0
分享到:
评论
1 楼 chjr 2011-01-15  
how to set the max connections ?

thanks!

相关推荐

Global site tag (gtag.js) - Google Analytics