java - 使用带有 tomcat 的 c3p0 与 MySQL 的僵尸连接

标签 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 代码建立的。

最佳答案

有几种可能性。

最有可能的是,您已将此 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/

相关文章:

apache 2.4 AJP 代理不工作

Katalon-Studio 中的 Java 脚本

java - 用户使用 SQLite 数据库登录 java.lang.NullPointerException

java - 连接java和sql。错误

php - 每月 echo 分数,即使该月没有数据

java - 请求将在 spring : 中转到错误的处理程序

java - 为什么在将 List 转换为 MultiKeyMap 时不会出现编译错误?

php - 使用 php 电子邮件生成带有动态值的 html

mysql - 在 MySQL 中组合多个查询结果(按列)

tomcat - server.xml 中的环境/系统变量