一、
经过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的文档。
分享到:
相关推荐
在这个场景中,我们将深入探讨如何使用C3P0连接池来与MySQL数据库进行交互,并结合log4j进行日志记录。 首先,要使用C3P0,你需要在项目中引入相应的依赖。在Maven项目中,可以在pom.xml文件中添加以下依赖: ```...
在这个主题中,我们主要关注Java如何通过JDBC与MySQL8进行连接,以及如何使用C3P0作为数据库连接池来优化性能。 1. **Java JDBC与MySQL连接**: - **JDBC驱动**:在Java中,与MySQL8通信需要适当的JDBC驱动。通常...
通过合理配置c3p0的各项参数,可以有效避免因数据库连接问题而导致的应用程序异常中断,从而保障系统的稳定运行。在实践中,还需要根据具体的应用场景不断调整优化这些配置,以达到最佳的性能效果。
C3P0数据库连接池是一个开源的Java连接池实现,由Miquel Arroyo创建,主要用于管理和优化数据库连接。在Java应用中,数据库连接的建立、关闭和管理是一个耗时的过程,而C3P0则通过提供连接池功能,提高了数据库操作...
<property name="hibernate.c3p0.timeout">300 <!-- 其他c3p0相关配置... --> ``` 同时,确保在类路径下包含c3p0相关的jar包,通常包括`c3p0-*.jar`、`mchange-commons-java-*.jar`和`jdbc驱动的jar包`。 **四、c3...
<property name="hibernate.c3p0.timeout" value="300"/> <property name="hibernate.c3p0.max_statements" value="50"/> ``` 这些配置分别设置了最小连接数、最大连接数、超时时间和最大预编译SQL语句数量。 总之...
c3p0.timeout=300 c3p0.idle_test_period=600 ``` 然后,通过编程方式或依赖注入来获取数据源,如使用Spring框架: ```java @Bean public DataSource dataSource() { ComboPooledDataSource cpds = new ...
C3P0是一个开源的JDBC连接池,它实现了...<property name="hibernate.c3p0.timeout">300 <property name="hibernate.c3p0.idle_test_period">3000 ``` 3. **配置数据源**:在配置文件中指定使用C3P0数据源。 ```xml ...
MySQL数据库的连接超时问题,通常表现为Wait_timeout错误,指的是当客户端与服务器之间的连接在指定时间内没有进行任何数据交互,数据库会自动断开这个连接,以释放资源并防止不必要的资源占用。这一特性在MySQL中是...
3. **连接池**:对于高并发的应用场景,使用数据库连接池(如HikariCP、C3P0)来复用数据库连接,减少频繁创建和销毁连接带来的性能开销。 通过上述步骤和实践,开发者可以有效地在Java应用中实现与MySQL数据库的...
<property name="hibernate.c3p0.timeout">300 <property name="hibernate.c3p0.idle_test_period">3000 <property name="hibernate.c3p0.acquire_increment">3 <property name="hibernate.c3p0.max_statements...
在本项目"SpringMVC-CloudServer"中,我们主要关注的是基于Maven的基础配置、MySQL数据库的使用以及c3p0数据源的集成。这是一个典型的Java Web项目,旨在搭建一个服务端应用,通过SpringMVC框架处理客户端请求。下面...
总的来说,处理MySQL的`wait_timeout`连接超时问题需要综合考虑应用的需求、服务器配置以及连接管理策略。通过优化这些方面,可以有效地避免由于超时导致的通信故障,并提高系统的稳定性和资源利用率。
作为数据库连接管理的重要工具,C3P0提供了高效、灵活和可配置的数据库连接管理机制,以优化数据库应用的性能和稳定性。在Java Web应用中,C3P0被广泛用于处理数据库连接的创建、分配、回收和关闭,从而减少频繁的...
<property name="hibernate.c3p0.timeout">300 <property name="hibernate.c3p0.idle_test_period">3000 <property name="hibernate.c3p0.acquire_increment">1 <property name="hibernate.c3p0.validate">true ...
<property name="hibernate.c3p0.timeout" value="300"/> <property name="hibernate.c3p0.acquireIncrement" value="1"/> <property name="hibernate.c3p0.idleTestPeriod" value="3000"/> ``` 这些配置项分别指定...
c3p0.timeout=60000 ``` ### 注意事项 1. **合理设置参数**:每个应用都有其特定的并发需求,因此应根据实际情况调整C3P0的配置参数,避免资源浪费或因连接不足导致的性能瓶颈。 2. **监控与日志**:生产环境中,...
本主题将详细介绍如何在MySQL数据库应用中使用C3P0连接池,并涉及相关jar包的配置和使用。 1. **C3P0简介** C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。C3P0的特点...