我有一个 Java 应用程序,其 context.xml 中有以下行
<Resource
driverClassName="com.mysql.jdbc.Driver"
maxActive="100"
maxIdle="30"
initialSize="10"
maxWait="7000"
name="jdbc/app"
password="pass"
type="javax.sql.DataSource"
url="jdbc:mysql://dbhost:3306/dbname?autoReconnect=true"
username="user"
validationQuery="SELECT 1"
removeAbandoned="true"
removeAbandonedTimeout="30"
logAbandoned="true"
/>
在 mysql 中,“显示变量”告诉我 max_connections 是 151。
仍然,
use information_schema;
select count(*) from processlist where User = 'user';
永远不会显示超过 20 个连接。在 tomcat 的 catalina.out -log 上,我得到
Caused by: org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool exhausted
at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:103)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:113)
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79)
我应该检查什么来发现问题?
答案1
并检查应用程序是否正确关闭连接,这是程序员要做的事情,但仍然是一个常见的错误。
答案2
我不确定这是否是 Tomcat 的问题,请检查 MySQL 是否限制了连接数。
答案3
还要检查 MySQL 的 max_user_connections 变量。