我正在使用 c3p0 来管理与 MySQL 的数据库连接。
问题是某些连接被永远保留。我的连接数限制为 1000 个,但由于某种未知原因,打开的连接数为 1200 个。为了调查它,我在 tomcat 服务器 shell 中执行以下命令:
netstat -n |grep 3306|grep ESTABILISHED|wc -l
它返回 1200
这是 c3p0 配置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:我在这个应用程序中没有使用休眠(只是在几个类中)。大多数连接都是通过纯 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" />
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)