我有一个在四个服务器上负载均衡的web应用程序。这三个服务器连接到公共数据库,最大连接设置为600。
tomcat当前数据库池配置如下:
<Resource name="jdbc/AppDB"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
removeAbandoned ="true"
removeAbandonedTimeout="300"
testOnBorrow="true"
validationQuery="select 1"
logAbandoned ="true"
username="username"
password="password"
driverClassName="com.mysql.jdbc.Driver"
url="dbconnectionurl"
/>
但是这个配置给出Exception: Connection Timeout : Waiting for Idle Object.
我已经监控了数据库服务器,我的有效连接利用率只有350。
如果我向后计算,我总共有400个连接在使用。这使我可以从DB获得200个额外的数据库连接。
因此,我无法理解为什么会出现这个异常。
谁能建议一个更好的配置?maxActive
和maxIdle
的理想比例是多少?更新:我找到了一个相关的链接:Tomcat JDBC池中空闲连接不足
但是我不能冒险将maxIdle或MaxActive设置为-1(INFINITE),因为我有多个实例正在运行,并且它可能使连接分布不均匀。这可能导致一个实例执行良好,而其他实例可能由于缺乏连接而失败。
首先,maxIdle
与您的问题没有任何关系,因为这只定义了池中保留了多少未被积极使用的连接—多余的连接将被丢弃。为了说明这一点:假设在t1处有80个连接正在使用;在t2时,只有30个连接仍在使用,这意味着50个连接被放回池中。maxIdle
设置为30会导致池关闭50个空闲连接中的20个。
现在,如果在t3 50个连接再次被使用,那么"空闲池"将只包含10个连接。空闲池中的连接数没有主动增加!
说明:maxActive
是池提供的最大连接数。maxIdle
不会在此基础上添加另一堆连接;它只是为基本负载保持一定数量的连接的一种方法,加速了连接的使用(如果maxIdle
为0,返回到连接池的每个连接将被关闭,从而阻碍了连接池的想法)。
为您的情况建议适当的比率有点困难,因为它取决于您的应用程序必须面对的负载曲线。但是对于您所面临的问题(池没有返回空闲,即。"free"连接),如果将其设置为-1
也没关系,因为池已经耗尽了。
所以要解决这个问题,你要么需要增加maxActive
,要么需要找到更有效地使用连接的方法。