【问题标题】:Java - Number of connections being hold by C3P0 dont match with the sleeping ones in MySQLJava - C3P0 持有的连接数与 MySQL 中的睡眠连接数不匹配
【发布时间】:2015-11-29 17:39:34
【问题描述】:

好吧,这里是场景:

我正在使用 Java,并且我有一个集中的类来连接和断开与数据库的连接。我已将 ComboPooledDataSource 的最大池大小设置为 30 (cpds.setMaxPoolSize(30)),没有特殊原因。 MySQL 将 time_wait 配置设置为 100 秒。

我的问题:

当运行我的程序并将其日志与 MySQL 中生成的日志进行比较时,我可以清楚地看到 MySQL 正在做它应该做的事情:在 100 秒后关闭睡眠连接(正是我的程序创建的连接)。但是在 MySQL 中关闭的相同连接似乎在我的 C3P0 连接池中仍然存在,因为连接数量只会增加(每次需要 cpds.getNumConnections() 的新连接时我都会对其进行测试)。

有什么方法可以清除 c3p0 中未使用的连接(在 MySQL 中关闭的连接)?因为我的最大连接数即将达到(200s - 300s)。 MySQL关闭的连接不会在c3p0中自动关闭?

【问题讨论】:

    标签: java mysql jdbc connection-pooling c3p0


    【解决方案1】:

    C3P0 提供了许多超时参数。详情请查看他们的文档:http://www.mchange.com/projects/c3p0/#basic_pool_configuration

    您尤其会对“管理池大小和连接年龄”部分感兴趣。以下是您可以调整的一些设置:maxConnectionAge、maxIdleTime、maxIdleTimeExcessConnections

    【讨论】:

      【解决方案2】:

      MySQL 没有time_wait 参数。 time_wait 是 TCP 连接的状态。

      如果您将 wait_timeout 设置为 100(覆盖其默认值 28800),您就是在自找麻烦。像 c3p0 这样的连接池的全部意义在于保持连接打开,以便它们可以被重用。

      c3p0 可以检测和观察连接何时被 DBMS 通过连接测试从其下方关闭。见http://www.mchange.com/projects/c3p0/#configuring_connection_testing

      如果您真的希望您的 MySQL 在 100 秒后终止您的连接,并且您希望 c3p0 注意到这一点,您可以将 c3p0 的 idleConnectionTestPeriod 设置为 30 左右,c3p0 将快速检测并处理死连接。但是当连接数低于minPoolSize 时,它将重新创建死连接,您的应用程序将无用地搅动。更好的方法是让 MySQL 的 wait_timeout 保持较大,并使用 maxPoolSize 控制打开的连接数。

      (不过,您仍然需要配置某种形式的连接测试,几乎总是如此。)

      【讨论】:

        猜你喜欢
        • 2013-05-17
        • 2013-08-20
        • 1970-01-01
        • 1970-01-01
        • 2011-04-15
        • 2022-01-25
        • 1970-01-01
        • 1970-01-01
        • 2015-11-20
        相关资源
        最近更新 更多