数据库连接池大小决策背后的思考



我正在开发基于java的开源应用程序,即xwiki。在hibernate.cfg.xml中,我可以看到参数connection.pool_size和statement_cache.size为2(每个)。我的应用程序在某个时间点的最大负载将达到100个用户。现在我的问题是,理想的连接池大小应该是多少。对我来说,2号看起来很小。如果一次有100个用户连接,98个用户必须等待连接释放?在我的情况下,我应该将连接池大小保持为100吗?

我使用的是microsoftsqlserver。

除此之外,最大连接池大小也有限制。它依赖于Web服务器(在我的例子中是tomcat)还是数据存储供应商(ms-sql服务器)?

确定连接池的大小不是一件小事

  • 调查连接使用情况的指标
  • 无可用连接时的故障切换机制

FlexyPool旨在帮助您确定正确的连接池大小。

如果一个典型的请求花费50%的时间进行计算,50%的时间用于数据库连接,那么您的池中可能只需要50个连接。当然,您的应用程序应该尽早释放数据库连接。

一般来说,对于数据库来说,保持连接并不昂贵(而创建新连接则相当昂贵)。保持足够高的尺寸应该没有问题。

您可以设置

  • 最大池大小为100
  • 首选池大小为50
  • 并且对于池连接,空闲超时为5分钟

我不熟悉微软的sql server,但我认为它的最大池限制是100

Tomcat可以处理这个数量的池大小。

您应该评估应用程序的并发需求、数据库操作时间,以及服务器(或数据库供应商)可以支持的连接数量。

因此,100个用户并不意味着你需要一个大小为100的连接池。

请注意,如果池未使用,可能会白白消耗内存。池配置在很大程度上取决于瓶颈所在:

CPU、内存、磁盘、网络、复杂的数据库查询、高并发、。。。很多?

默认池大小通常为5到10。首先确保数据库有问题。在人为负载下尝试2或30这样的极端情况,看看它的表现如何。我认为@vladmihalcea提供的链接非常有趣。

最新更新