13

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

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

默认值:2,最小值:1,推荐:3-4(但非常特定于应用程序)

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

4

1 回答 1

20

所以在内部 BoneCP 有连接池的分区计数。每次线程尝试使用连接时,它都会thread.getId() % partitionCount从该池中获取并使用连接。您总共将拥有maxConnectionsPerPartition * partitionCount连接数。

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

将其设置为什么数字?我认为核心数是一个好的开始,因为无论如何你不会有更多的并行工作。但除此之外,还要尝试预测有多少线程会竞相连接、测量和重复。

顺便说一句,世界上大部分地区已经依赖 c3po 十多年了,并且基本上将分区计数设置为 1。所以你不会出错。

于 2013-01-21T19:08:25.447 回答