我正在使用 c3p0 来管理与 MySQL 的数据库连接。 问题是某些连接永远保持着。我有 1000 个连接的限制,但由于某些未知原因,有 1200 个打开的连接。为了调查它,我在 tomcat 服务器 shell 中执行了这个命令:
netstat -n |grep 3306|grep ESTABILISHED|wc -l
它返回 1200
这里是context.xml
中的c3p0配置
<Resource name="jdbc/xxxx" auth="Container"
user="xxxxxx"
password="xxxxx"
driverClass="com.mysql.jdbc.Driver"
jdbcUrl ="jdbc:mysql://xxxx:3306/xxx"
factory="org.apache.naming.factory.BeanFactory"
type="com.mchange.v2.c3p0.ComboPooledDataSource"
maxPoolSize="1000"
minPoolSize="200"
numHelperThreads="10"
acquireIncrement="50"
maxStatementsPerConnection="0"
idleConnectionTestPeriod="200"
maxIdleTime = "1000"
maxIdleTimeExcessConnections = "180"
maxStatements="200"
unreturnedConnectionTimeout="10"
debugUnreturnedConnectionStackTraces="true"
/>
如果池最大大小为 1000,怎么可能建立 1200 个连接? 我的 MySQL 服务器配置为
interactive_timeout 28800
wait_timeout 1300
OBS:我没有在这个应用程序中使用 hibernate (只是在几个类中)。大多数连接都是通过纯 JDBC 代码建立的。
最佳答案
有几种可能性。
最有可能的是,您已将此 Resource 元素放置在 $CATALINA_BASE/conf/context.xml
中,该文件为每个 Web 应用程序提供了默认的 context.xml。因此,如果您有六个 Web 应用程序,您将有六个连接池。由于最小轮询大小为 200,因此将至少打开 200*6=1200 个数据库连接。
另一种可能是 Web 应用程序已重新加载。你应该得到一个新的连接池,旧的连接池将被 GC。但是,如果您在重新加载时发生内存泄漏(很容易在没有意识到的情况下发生),它可能会将连接池及其打开的连接保留在内存中,从而增加您的总连接数。
将定义放入server.xml
:
<Server>
<GlobalNamingResources>
<Resource name="jdbc/xxxx">...</Resource>
</GlobalNamingResources>
</Server>
在 context.xml
中:
<ResourceLink name="jdbc/xxxx"
global="jdbc/xxxx"
type="com.mchange.v2.c3p0.ComboPooledDataSource" />
关于java - 使用带有 tomcat 的 c3p0 与 MySQL 的僵尸连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10526313/