我正在使用一个在四台服务器上进行负载平衡的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"
/>
但是这个配置给出了例外:Connection Timeout : Waiting for Idle Object.
我已监控数据库服务器,我对连接的有效利用率仅为350。
如果我向后计算,我会主动使用400个连接。这为DB提供了200个额外的数据库连接。
因此,我无法理解为什么会出现这种异常。
有人可以建议更好的配置吗?
maxActive
和maxIdle
的理想比例应该是多少?
更新:
我找到了一个相关的链接: There are not enough idle connections in Tomcat JDBC pool
但我无法将maxIdle或MaxActive设置为-1(INFINITE),因为我有多个实例正在运行,并且可能会导致连接分布不均匀。这可能会导致一个实例运行良好,而其他实例可能会由于缺少连接而失败。
答案 0 :(得分:4)
首先,maxIdle
与您的问题没有任何关系,因为这只定义了池中保存的未被主动使用的连接数 - 将删除多余的连接。为了说明这一点:假设在 t1 80个连接正在使用中;在 t2 ,只有30个连接仍在使用,这意味着50个连接将被放回池中。 maxIdle
设置为30现在会导致池关闭50个空闲连接中的20个
现在,如果再次使用 t3 50个连接,“空闲池”将只包含10个连接。闲置池中的连接数没有主动增加!
要明确说明:maxActive
是池提供的最大连接数。 maxIdle
不会在其上添加另一堆连接;它只是为基本负载保留大量连接的一种方法,加快了连接的使用(如果maxIdle
为0,则返回到池的每个连接都将被关闭,从而阻碍了连接池的想法)。
为您的案例建议适当的比例有点困难,因为它取决于您的应用程序必须面对的负载曲线。但是对于你所面临的问题(池没有返回空闲,即“免费”连接),如果你将它设置为-1
并不重要,因为池只是用尽了。
因此,要解决您的问题,您需要增加maxActive
,或者需要找到更有效地使用连接的方法。