Zombie使用c3p0和tomcat连接到MySQL

时间:2012-05-10 01:15:03

标签: java mysql tomcat connection-pooling c3p0

我正在使用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代码完成的。

1 个答案:

答案 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" />