1

我有一个在四台服务器上负载平衡的 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多少?

更新:

我找到了一个相关链接: Tomcat JDBC pool 中没有足够的空闲连接

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

4

1 回答 1

5

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

为了清楚起见:maxActive是池提供的最大连接数。maxIdle不会在此之上添加另一组连接;它只是为基本负载保留多个连接、加快连接使用的一种手段(如果maxIdle为 0,则返回到池的每个连接都将被关闭,从而阻碍了连接池的想法)。

为您的案例建议一个合适的比率有点困难,因为它取决于您的应用程序必须面对的负载曲线。但是对于您面临的问题(池不返回空闲,即“免费”连接),您是否将其设置为 无关紧要-1,因为池只是用尽了。

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

于 2013-04-18T08:54:20.837 回答