【发布时间】:2019-03-25 13:39:33
【问题描述】:
我正在使用 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 相同,详细信息 here。
据此,我在context.xml中为连接池设置了如下Resource元素:
<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) 不同。
【问题讨论】:
-
你用的是哪个版本的tomcat?
-
@Selaron Tomcat 8.0.43 版(我更新了问题以包含这个)。
-
确保您只考虑“已建立”的连接。
-
@LuisMuñoz 在哪里?在我的
Resource元素属性中?或者当我计算连接数时? -
计算连接数时。
标签: tomcat jdbc connection-pooling jdbc-pool tomcat-dbcp