2

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

4

1 回答 1

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" />
于 2012-05-10T09:05:02.717 回答