我正在使用c3p0来管理我与MySQL的数据库连接。 问题是一些连接永远存在。我有1000个连接的限制,但由于某些未知的原因,有1200个打开的连接。为了研究它,我在tomcat服务器shell中执行此命令:
netstat -n |grep 3306|grep ESTABILISHED|wc -l
并返回1200
这是context.xml
<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代码完成的。
答案 0 :(得分:0)
有几种可能性。
最有可能的是,您已将此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" />