一、
经过N多试验,终于自己把这个问题搞定了。
网上关于C3P0在spring中的配置,几乎没有完全正确的(至少我还没发现)。查了c3p0的文档,又试验过N次。得出如下配置是正确的:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass"><value>${jdbc.driverClassName}</value></property>
<property name="jdbcUrl"><value>${jdbc.url}</value></property>
<property name="user"><value>${jdbc.username}</value></property>
<property name="password"><value>${jdbc.password}</value></property>
<property name="minPoolSize"><value>1</value></property>
<property name="maxPoolSize"><value>20</value></property>
<property name="maxIdleTime"><value>1800</value></property>
<property name="acquireIncrement"><value>2</value></property>
<property name="maxStatements"><value>0</value></property>
<property name="initialPoolSize"><value>2</value></property>
<property name="idleConnectionTestPeriod"><value>1800</value></property>
<property name="acquireRetryAttempts"><value>30</value></property>
<property name="breakAfterAcquireFailure"><value>true</value></property>
<property name="testConnectionOnCheckout"><value>false</value></property>
<!--
<property name="properties">
<props>
<prop key="c3p0.minPoolSize">1</prop>
<prop key="c3p0.maxPoolSize">10</prop>
<prop key="c3p0.maxIdleTime">1800</prop>
<prop key="c3p0.acquireIncrement">2</prop>
<prop key="c3p0.maxStatements">0</prop>
<prop key="c3p0.initialPoolSize">2</prop>
<prop key="c3p0.idleConnectionTestPeriod">1800</prop>
<prop key="c3p0.acquireRetryAttempts">30</prop>
<prop key="c3p0.breakAfterAcquireFailure">true</prop>
<prop key="c3p0.testConnectionOnCheckout">true</prop>
<prop key="user">root</prop>
<prop key="password">999999</prop>
</props>
</property>
-->
</bean>
<!-- Hibernate SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingDirectoryLocations">
<list>
<value>classpath:/com/licaionline/domain/</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.connection.release_mode">auto</prop>
<prop key="hibernate.autoReconnect">true</prop>
<prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
<!--
<prop key="hibernate.useUnicode"></prop>
<prop key="hibernate.characterEncoding"></prop>
<prop key="hibernate.default-lazy-init"></prop>
<prop key="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
-->
<!--
<prop key="hibernate.c3p0.acquire_increment">2</prop>
<prop key="hibernate.c3p0.idle_test_period">1800</prop>
<prop key="hibernate.c3p0.timeout">1800</prop>
<prop key="hibernate.c3p0.max_size">30</prop>
<prop key="hibernate.c3p0.min_size">2</prop>
<prop key="hibernate.c3p0.max_statements">50</prop>
-->
</props>
</property>
注意:注释掉的那些,都是错误的。网上流行的,基本上跟注释掉的那些差不多。配错了,并无异常,还是能正常使用。但是所作的配置不起作用。
二、
起作用的,是datasource里面的这一句:
<property name="maxIdleTime"><value>1800</value></property>
这儿设置成每隔1800秒就扫描一次,检查一下空闲的链接。所以,用户基本上不会得到空闲的链接了。
如果再不放心,
<property name="testConnectionOnCheckout"><value>false</value></property>
这儿设置成true。每次连接之前,都要测一下。但是这样会影响效率。
三、
解决的方法有3种:
增加wait_timeout的时间。
减少Connection pools中connection的lifetime。
测试Connection pools中connection的有效性。
当然最好的办法是同时综合使用上述3种方法,下面就DBCP和C3P0分别做一说明,假设wait_timeout为默认的8小时
DBCP增加以下配置信息:
//set to 'SELECT 1'
validati
//set to 'true'
testWhileIdle = "true"
//some positive integer
timeBetweenEvictionRunsMillis = 3600000
//set to something smaller than 'wait_timeout'
minEvictableIdleTimeMillis = 18000000
//if you don't mind a hit for every getConnection(), set to "true"
test
C3P0增加以下配置信息:
//set to 'SELECT 1'
preferredTestQuery = 'SELECT 1'
//set to something much less than wait_timeout, prevents connections from going stale
idleConnectionTestPeriod = 18000
//set to something slightly less than wait_timeout, preventing 'stale' connections from being handed out
maxIdleTime = 25000
//if you can take the performance 'hit', set to "true"
testConnectionOnCheckout = true
更多的配置信息大家可以查看C3P0文档,Connector/J文档,以及DBCP的文档。
分享到:
相关推荐
java c3p0连接mysql数据库 java c3p0连接mysql数据库 java c3p0连接mysql数据库 可以直接运行
java语言连接Mysql数据库。通过Eclipse集成开发工具,编写java类文件,实现JDBC连接。 通过c3p0连接数据库的三种方法,包括xml文件、properties文件。
博文链接:https://wxinpeng.iteye.com/blog/203088
Java连接MySQL数据库查询。 使用C3P0连接池查询数据库,用log4j做日志。
C3P0数据库连接池和jar包,因为jdbc没有保持连接的能力,一旦超过一定时间没有使用(大约几百毫秒),连接就会被自动释放掉。而每次新建连接都需要140毫秒左右的时间,所以耗费时间比较多。若使用C3P0连接池来池化...
C3P0方式实现对MySQL数据库的操作案例、有增删改查功能。
jdbc使用c3p0连接池连接数据库,支持配置多个数据源,有相关的查询测试。
java开发,数据库连接池c3p0所需jar包。
MySQL数据库服务器下C3P0连接池的配置.pdf
这里有关于吃c3p0数据库连接池所需要的jar包。。。。。。。。。。。。
博文链接:https://wxinpeng.iteye.com/blog/203110
java中c3p0数据库连接池使用方法(c3p0-config.xml+c3p0-0.9.2-pre1.jar+JdbcPool_c3p0.java),里面包含了c3p0-0.9.2-pre1.jar、以及配置文件:c3p0-config.xml、以及一个c3p0数据库连接池工具类(只有简单的两个方法...
c3p0配置数据库连接池、数据库连接池 已经测试通过,可以提供给新入门的朋友学习之用,如果是要结合spring就不用下载了,网上其他地方应该很多资料,简单修改一下,原理都是一样的。
C3P0用于连接数据库
适用于mysql8,数据库连接池c3p0,亲测适用。
c3p0数据库缓冲池配置 a----最大JDBC连接数量,超出这个数量就会抛异常. b----最少JDBC连接数量. c----以秒为单位。如果空闲连接的空闲超过了timeout,就会删除 d----最大的PreparedStatement的数量 e----每隔...
C3P0是一个开放源代码的JDBC连接池,Hibernate的发行包中默认使用此连接池。据说性能最好。 C3p0连接池连接数据库教程+JavaDemoo Demo包括两个,一个代码配置方法,一个是XML配置方法
mysql默认8小时闲置就会断开,会导致下次操作数据库报异常,c3p0可以完美解决!