Tomcat连接池配置:属性设置。示例和建议

时间:2014-03-07 08:52:55

标签: java tomcat connection-pooling

在我的Web应用程序的context.xml文件中,我使用:

<Resource name="jdbc/mydb" auth="Container" type="javax.sql.DataSource"
          removeAbandoned="true" removeAbandonedTimeout="60"
          maxActive="30" maxIdle="30" maxWait="10000"
          username="myuser" password="mypwd" driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://localhost:3306/mydb"
          factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" closeMethod="close" 
          validationQuery="select 1" testOnBorrow="true" /> 

它有效,但我不确定30个同时连接是否足够(Web应用程序就像拍卖一样,并且还有管理员访问权限)。

此外我不知道是否

 removeAbandonedTimeout="60"

太多了,应该如何计算。

是否有关于连接池方案的帖子/文章,关于如何平衡资源属性?

1 个答案:

答案 0 :(得分:2)

如何配置数据库连接池取决于使用它的应用程序的特性。我可以提供一些提示,但最终你必须通过(加载)测试自行找出。

首先,仔细阅读documentation。例如,removeAbandoned选项是对不能关闭/返回池连接的错误代码的回退(来自文档:Setting this to true can recover db connections from applications that fail to close a connection)。如果使用removeAbandoned,则在测试应用程序时也应使用logAbandoned(设置为true)。 removeAbandonedTimeout应调整为运行时间最长的查询(来自文档:The value should be set to the longest running query your applications might have.)。

询问你的DBA他是否更喜欢空闲连接上的新连接并相应地调整minEvictableIdleTimeMillis(一些DBA相当少的新连接(例如1小时的空闲超时))而其他人更喜欢空闲连接尽快关闭(例如30秒的空闲超时))。

10秒的maxWait可能太低而无法生产。我将其保持在50秒(数据库用于报告死锁的相同超时),以便网络和数据库hickup(将发生)不会导致应用程序错误。另一方面,当(加载)测试时,将此值设置为低(例如3秒)以指示池何时太小(即maxActive太低)。

如果应用程序管理员需要保证访问权限,则需要另一个(第二个)池才能为这些特殊用户提供服务。否则,无法保证他们可以“进入”,并且当出现问题并且常规池完全耗尽时,他们可能必须进入。

我之前提到了负载测试,一些额外的指示:

  • 确保测试数据库代表生产数据库。在生产数据库上运行很长时间的查询必须在测试数据库上运行很长时间。
  • 调整池参数以进行测试(因此您可以快速发现奇怪的行为)和生产(使其尽可能稳定并确保您会注意到非常糟糕的事情)。
  • 重复负载测试批量运行,使用较低的maxActive值,直到您开始注意到吞吐量(或批处理运行时)的真正差异。例如,我最近测试了一个24个线程的应用程序,它们都在执行数据库操作,并以最大池大小16开始。然后执行最大池大小为8的运行并且几乎没有看到任何差异。然后进行了最大泳池大小为4的运行并注意到了差异。因此,最大池大小为8就足够了。

提高效率的一些提示:

  • 确保租用和释放连接之间的所有代码仅执行数据库操作(例如,没有日志记录,因为它刷新到磁盘上的文件,所以时间很长)。
  • 确保在finally块中释放/关闭连接,以便连接不会从池中泄漏。
  • 在从池中租用连接之前准备查询中使用的所有数据。

快乐负载测试......