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

Lea*_*ore 1 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"
                 />
Run Code Online (Sandbox Code Playgroud)

但是此配置会产生异常: Connection Timeout : Waiting for Idle Object.

我已经监视了数据库服务器,我对连接的有效利用仅为350。

如果我向后计算,则总共有400个活跃连接。这使我可以从DB获得200个额外的数据库连接。

因此,我不明白为什么会出现此异常。

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

更新:

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

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

ski*_*sch 5

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

明确说明:maxActive是池提供的最大连接数。maxIdle在此之上不添加其他连接;这只是为基本负载保留多个连接,以加快连接使用率的一种方法(如果maxIdle为0,则将关闭返回到池的每个连接,从而挫败了连接池的想法)。

为您的情况建议合适的比率有点困难,因为这取决于您的应用程序必须面对的负载曲线。但是对于您所面临的问题(池不返回空闲(即“免费”)连接),如果将其设置为-1,则无济于事,因为池已耗尽。

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