C3P0连接池使用此配置提供连接超时错误

时间:2015-12-22 04:19:04

标签: spring-mvc c3p0 connection-timeout

我正在使用树脂服务器+ 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

2 个答案:

答案 0 :(得分:4)

所以,很多事情。

  • c3p0具有用于观察和调试Connection泄漏的内置工具。请设置配置参数 unusedConnectionTimeout unreturnedConnectionTimeoutdebugUnreturnedConnectionStackTraces。设置unreturnedConnectionTimeout,定义一段时间,之后c3p0应该假定Connection已泄漏,并将其关闭。设置debugUnreturnedConnectionStackTraces以询问c3p0以记录检出未正确检入的Connection的堆栈跟踪。见Configuring to Debug and Workaround Broken Client Applications
  • 您正在以非标准方式配置c3p0。这可能没问题,但是你想验证你想要设置的配置是配置c3p0得到的配置。 c3p0 DataSources在池初始化时将其配置转储到INFO。 请考虑检查以确保您获得了您想要的配置。或者,您可以通过JMX检查DataSource的运行时配置。
  • 除了非标准的配置方式外,您的一些配置属性似乎不对。 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检查Connection泄漏的方法,因为我喜欢看到人们使用更高级的c3p0 API。只要您不热更新DataSource的配置,它就可以正常工作。但是你不需要去那么麻烦,并且不能保证这种方法在将来的版本中会继续有效.c3p0对ConnectionCustomizer生命周期没有任何承诺。 ConnectionCustomizer旨在成为无状态。使用c3p0的内置泄漏检查功能更容易,更安全,如上面的第一个要点所述。

答案 1 :(得分:1)

由于程序中可能存在连接泄漏(连接超时的可能原因),您需要按照以下步骤识别泄漏。

在c3p0.properties文件中输入

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC 
  "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name = "connection.driver_class">oracle.jdbc.OracleDriver</property> 
<property name = "connection.url">jdbc:oracle:thin:@localhost:1521:xe</property> 
<property name = "connection.username">hr</property> 
<property name = "connection.password">kiran</property> 
<property name = "connection.pool_size">10</property> 
<property name = "dialect">org.hibernate.dialect.OracleDialect</property>
<property name = "hbm2ddl.auto">create</property>
<property name = "show_sql">true</property>
<mapping resource = "resources/student.hbm.xml"/>
</session-factory>
</hibernate-configuration>

创建一个名为“ConnectionLeakDetector”的类,并将其放在适当的包中。以下是该课程的内容。

c3p0.connectionCustomizerClassName = some.package.ConnectionLeakDetector

onCheckOut方法将在获取连接时递增计数,而onCheckOut将在连接释放时递减计数。

执行一些方案并观察控制台上的统计信息。如果计数大于0,则执行的方案具有连接泄漏。尝试修复它们,你会发现差异。

作为旁注,您可以将jdbc.maxPoolSize作为临时解决方案递增,直到部署修复程序。