BoneCP中partitionCount的更好解释

Fel*_*ipe 12 java database bonecp

来自官方BoneCP doc:http://jolbox.com/index.html?page = http://jolbox.com/configuration.html

partitionCount为了减少锁争用并从而提高性能,每个传入连接请求都从具有线程关联性的池(即pool [threadId%partition_count])中选择一个连接.这个数字越高,当你有足够的短期线程时,你的性能会越好.超过某个阈值时,这些池的维护将开始对性能产生负面影响(仅适用于分区上的连接开始耗尽的情况).

默认值:2,最小值:1,推荐值:3-4(但非常适合应用)

但它不是那么清楚,没有一个很好的例子.我正在运行一个普通的Web服务,同时有0-500个线程.这是一个很好的价值,为什么?

Mir*_*ari 19

因此,内部BoneCP具有连接池的分区计数.每次线程尝试使用连接时,它都需要thread.getId() % partitionCount并使用该池中的连接.而且你将拥有maxConnectionsPerPartition * partitionCount多个连接.

为什么这会对性能产生积极影响?好吧,没有两个线程同时在同一个连接上使用(显然这会很糟糕),BoneCP必须锁定才能释放或获取连接.但同时所有其他想要做同样事情的线程都必须等待锁定.因此,从某种意义上说,您可以partitionCount并行释放或获取多个连接.

设置它的号码是多少?我认为核心数量是一个良好的开端,因为无论如何你都不会有更多的工作并行发生.但除此之外,试图预测将有多少线程竞争连接,测量和重复.

顺便说一下,世界上大多数人已经依赖c3po超过十年了,基本上将分区数设置为1.所以你不能错过它.

  • BoneCP的作者:这个解释很完美.只是想补充说,拥有更多分区也意味着每个分区通常配置的连接数更少(因为它们被分割).如果一个线程试图命中一个耗尽的分区,它就会溢出来尝试从其他分区获取连接,所以在某些时候它实际上开始变慢.正如javadocs所说的那样,最大限度地坚持3-4左右(没有核心也是一个好的暗示). (8认同)