我正在使用树脂服务器+ 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
答案 0 :(得分:4)
所以,很多事情。
unreturnedConnectionTimeout
,定义一段时间,之后c3p0应该假定Connection已泄漏,并将其关闭。设置debugUnreturnedConnectionStackTraces
以询问c3p0以记录检出未正确检入的Connection的堆栈跟踪。见Configuring to Debug and Workaround Broken Client Applications。prefferedTestQuery
应为preferredTestQuery
。 numOfHelperThreads
应为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作为临时解决方案递增,直到部署修复程序。