在我的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"
太多了,应该如何计算。
是否有关于连接池方案的帖子/文章,关于如何平衡资源属性?
答案 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就足够了。提高效率的一些提示:
快乐负载测试......