Tomcat数据源配置连接超时和最大活动到空闲连接比率

时间:2013-04-18 06:58:38

标签: java database tomcat jdbc

我正在使用一个在四台服务器上进行负载平衡的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个额外的数据库连接。

因此,我无法理解为什么会出现这种异常。

有人可以建议更好的配置吗? maxActivemaxIdle的理想比例应该是多少?

更新:

我找到了一个相关的链接: There are not enough idle connections in Tomcat JDBC pool

但我无法将maxIdle或MaxActive设置为-1(INFINITE),因为我有多个实例正在运行,并且可能会导致连接分布不均匀。这可能会导致一个实例运行良好,而其他实例可能会由于缺少连接而失败。

1 个答案:

答案 0 :(得分:4)

首先,maxIdle与您的问题没有任何关系,因为这只定义了池中保存的未被主动使用的连接数 - 将删除多余的连接。为了说明这一点:假设在 t1 80个连接正在使用中;在 t2 ,只有30个连接仍在使用,这意味着50个连接将被放回池中。 maxIdle设置为30现在会导致池关闭50个空闲连接中的20个 现在,如果再次使用 t3 50个连接,“空闲池”将只包含10个连接。闲置池中的连接数没有主动增加!

要明确说明:maxActive是池提供的最大连接数。 maxIdle不会在其上添加另一堆连接;它只是为基本负载保留大量连接的一种方法,加快了连接的使用(如果maxIdle为0,则返回到池的每个连接都将被关闭,从而阻碍了连接池的想法)。

为您的案例建议适当的比例有点困难,因为它取决于您的应用程序必须面对的负载曲线。但是对于你所面临的问题(池没有返回空闲,即“免费”连接),如果你将它设置为-1并不重要,因为池只是用尽了。

因此,要解决您的问题,您需要增加maxActive,或者需要找到更有效地使用连接的方法。