我正在使用 树脂服务器 + spring 框架和 c3p0 连接池。 我已经使用以下属性文件配置了连接池。但是 以某种方式每 24 小时左右我的网站面临连接超时错误,然后我必须重新启动我的树脂服务器才能使网站重新上线。 请告诉我以下配置文件有什么问题以及我在这里遗漏了什么。

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.databaseURL=jdbc:mysql://localhost/my_database1_url
jdbc.StockDatabaseURL=jdbc:mysql://localhost/my_database2_url
jdbc.username=my_username
jdbc.password=my_password
jdbc.acquireIncrement=10
jdbc.minPoolSize=20
jdbc.maxPoolSize=30
jdbc.maxStockPoolSize=30
jdbc.maxStatements=100
jdbc.numOfHelperThreads=6
jdbc.testConnectionOnCheckout=true
jdbc.testConnectionOnCheckin=true
jdbc.idleConnectionTestPeriod=30
jdbc.prefferedTestQuery=select curdate();
jdbc.maxIdleTime=7200
jdbc.maxIdleTimeExcessConnections=5

最佳答案

所以,一堆东西。

  • c3p0 具有用于观察和调试连接泄漏的内置工具。请设置配置参数unusedConnectionTimeout unreturnedConnectionTimeoutdebugUnreturnedConnectionStackTraces 。设置一个 unreturnedConnectionTimeout 定义一段时间后,c3p0 应该假定连接已经泄漏,然后关闭它。设置 debugUnreturnedConnectionStackTraces 以要求 c3p0 记录 check out 未正确检入的连接的堆栈跟踪。见 Configuring to Debug and Workaround Broken Client Applications
  • 您正在以非标准方式配置 c3p0。这可能没问题,也可能没问题,但您想验证您打算设置的配置是否是 c3p0 获得的配置。 c3p0 数据源在池初始化时在 INFO 处转储其配置。请考虑检查以确保您获得了您想要的配置。或者,您可以通过 JMX 检查数据源的运行时配置。
  • 除了非标准的配置方式外,您的一些配置属性似乎有问题。 prefferedTestQuery 应该是 preferredTestQuerynumOfHelperThreads 应该是 numHelperThreads
  • 以下根本不是 c3p0 配置名称。也许您正在内部将它们映射到 c3p0 配置,但您想验证这一点。以下是 not-c3p0-property-names:
    jdbc.driverClassName=com.mysql.jdbc.Driver
    jdbc.databaseURL=jdbc:mysql://localhost/my_database1_url
    jdbc.StockDatabaseURL=jdbc:mysql://localhost/my_database2_url
    jdbc.username=my_username
    jdbc.maxStockPoolSize=30
    

    在标准的 c3p0.properties 形式中,您可能的意思是
    c3p0.driverClass=com.mysql.jdbc.Driver
    c3p0.jdbcURL=jdbc:mysql://localhost/my_database1_url
    # no equivalent -- jdbc.StockDatabaseURL=jdbc:mysql://localhost/my_database2_url
    c3p0.user=my_username
    # no equivalent -- jdbc.maxStockPoolSize=30
    

    请参阅 Configuration Properties 。同样,c3p0 对 jdbc. 前缀属性一无所知,但也许您自己的库或中间件中的某些东西会选择这些。

  • 注意: 我喜欢看到@NiSay 检查连接泄漏的方式,因为我喜欢看到人们使用更高级的 c3p0 API。只要您不热更新数据源的配置,它就会起作用。但是你不需要那么麻烦,并且不能保证这种方法会在 future 的版本中继续工作 c3p0 对 ConnectionCustomizer 生命周期不做任何 promise 。 ConnectionCustomizers 旨在是无状态的。使用 c3p0 的内置泄漏检查工具更容易、更安全,如上面的第一个要点所述。

    关于spring-mvc - C3P0 连接池使用此配置给出连接超时错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34408362/

    10-12 19:09