Tomcat数据源配置连接超时和最大Active to Idle连接比



我有一个在四个服务器上负载均衡的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个额外的数据库连接。

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

谁能建议一个更好的配置?maxActivemaxIdle的理想比例是多少?更新:

我找到了一个相关的链接: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,要么需要找到更有效地使用连接的方法。

相关内容

最新更新