数据库连接计数大于DBCP maxTotal设置的数量

时间:2019-03-25 13:39:34

标签: tomcat jdbc connection-pooling jdbc-pool tomcat-dbcp

我正在使用Tomcat(版本8.0.43)运行Java Web应用程序。

我将tomcat-dbcp.jar(Tomcat8.0.43随附)移动到jdk/jre/lib/ext,以便jre可以使用它。

我认为我正在使用Tomcat DBCP(与Apache Commons DBCP相对),但是据documentation所了解,配置参数与Apache Commons DBCP相同,其详细信息{{3 }}。

因此,我在Resource中为连接池设置了以下context.xml元素:

<Resource 
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
auth="Container" 
driverClassName="com.mysql.jdbc.Driver"  
logAbandoned="false" 
maxTotal="100" 
maxIdle="30" 
maxWaitMillis="10000" 
name="jdbc/[dbName]" 
password="${dbPassword}" 
removeAbandonedOnBorrow="true" 
removeAbandonedTimeout="60" 
type="javax.sql.DataSource" 
url="[dbUrl]autoReconnect=true" 
username="${dbUsername}" 
testWhileIdle="true" 
testOnBorrow="true" 
validationQuery="SELECT 1 AS dbcp_connection_test"/>

最近,我的日志中出现错误:

  

MySQLNonTransientConnectionException:连接太多

因此,我检查了错误发生时的连接数量(通过Amazon CloudWatch for RDS。特别是“ ConnectionCount”),它最多可以达到150个连接。如果我将maxTotal的连接设置为100,怎么可能?

我正在多个实例上运行我的应用程序。可以将maxTotal属性应用于每个实例吗(例如:如果我在2个实例上定义了连接池,那么我的maxTotal = 100 + 100 = 200?)

就像我在Resource元素中设置的属性被忽略一样。可能是我的设置有问题吗?我不是像假设的那样使用tomcat DBCP吗?

此外,如果我进一步看一下上面引用的Exception的StackTrack,我会看到

  

org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection

被调用。我不确定这是否意味着我使用的连接池(DBCP2)与我假设使用的连接池(Tomcat DBCP)不同。

1 个答案:

答案 0 :(得分:0)

  

maxTotal属性是否适用于每个实例(例如:如果我在2个实例上定义了连接池,那么我的maxTotal = 100 + 100 = 200?)

这是正确的,因为您已经在<Resource>文件中定义了context.xml
将资源添加到server.xml内,以使其可用于所有上下文,并确保将其从所有context.xml文件中删除。记下配置中不存在的global属性

<GlobalNamingResources>
    <Resource
        global="jdbc/[dbName]"

        factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
        auth="Container" 
        driverClassName="com.mysql.jdbc.Driver"  
        logAbandoned="false" 
        maxTotal="100" 
        maxIdle="30" 
        maxWaitMillis="10000" 
        name="jdbc/[dbName]" 
        password="${dbPassword}" 
        removeAbandonedOnBorrow="true" 
        removeAbandonedTimeout="60" 
        type="javax.sql.DataSource" 
        url="[dbUrl]autoReconnect=true" 
        username="${dbUsername}" 
        testWhileIdle="true" 
        testOnBorrow="true" 
        validationQuery="SELECT 1 AS dbcp_connection_test"/>
</GlobalNamingResources>

要关注:

  • testOnBorrow="true"导致的性能损失并不总是值得的。

  • testWhileIdle="true"timeBetweenEvictionRunsMillis相关,默认情况下为5秒。在某些情况下,默认值可能会太短。

  • 验证AWS RDS配额为not exceeded