我正在使用c3p0 0.9.1.2 config c3p0 ComboPooledDataSource。看起来一切正常,但是preferredTestQuery需要很长时间,并且占用DB服务器上的高CPU。
这是我的配置:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass"><value>${server.database.driver}</value></property>
<property name="jdbcUrl"><value>${server.database.url}</value></property>
<property name="user"><value>${server.database.user}</value></property>
<property name="password"><value>${server.database.password}</value></property>
<property name="initialPoolSize"><value>2</value></property>
<property name="minPoolSize"><value>2</value></property>
<property name="maxPoolSize"><value>10</value></property>
<property name="idleConnectionTestPeriod"><value>600</value></property>
<property name="maxIdleTime"><value>0</value></property>
<property name="preferredTestQuery"><value>SELECT 1 FROM DUAL</value></property>
<property name="testConnectionOnCheckin"><value>true</value></property>
</bean>在一天中,SELECT 1 FROM DUAL运行了大约一百万次,占用了大约30%的CPU。
那么,我可以减少每天执行preferredTestQuery的总次数吗?或者我应该使用另一个查询来测试?
你能给我一些关于c3p0更好的配置的建议吗?
发布于 2019-09-19 00:16:00
首先:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" >
<property name="driverClass" value="${server.database.driver}" />
<property name="jdbcUrl" value="${server.database.url}" />
<property name="user" value="${server.database.user}" />
<property name="password" value="${server.database.password}" />
<property name="initialPoolSize" value="2" />
<property name="minPoolSize" value="2" />
<property name="maxPoolSize" value="10" />
<property name="idleConnectionTestPeriod" value="600" />
<property name="maxIdleTime" value="0" />
<property name="preferredTestQuery" value="SELECT 1 FROM DUAL" />
<property name="testConnectionOnCheckin" value="true" />
</bean>发布于 2019-09-19 01:18:50
每天是否有一百万个连接签入,而这些连接在签出时做得很少?这是对你所看到的最直接的解释,大量的连接被检查出来,然后在没有做任何有意义的工作的情况下签入。
尽管如此,你描述的东西还是很奇怪。"SELECT 1 FROM DUAL“的全部要点是,它被认为是一个非常容易和高效的查询。它是Oracle DB吗?它是该查询有意义的后端吗?(对于其他几个DBMS,只需"SELECT 1“即可。)我要确保"SELECT 1 FROM DUAL“是适合您的后端的查询,DUAL实际上是它应该是的built-in dummy table。如果查询做的是真正的工作,那就是一个问题。
如果可以,一件容易做的事情是从非常旧的0.9.1.x系列升级到更新的版本。0.9.5.x系列使用Connection的原生isValid()方法进行测试(如果没有设置preferredTestQuery,通常不应该使用0.9.5+和JDBC4+驱动程序),希望您的JDBC驱动程序能够很好地选择有效的测试查询。
在C3P0的文档中有关于连接测试设置的some advice。
https://stackoverflow.com/questions/57996633
复制相似问题