论坛首页 Java企业应用论坛

谁来拯救C3P0的致命伤

浏览 4945 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-07-20   最后修改:2010-03-27

这几天北京下着雨,虽然天气凉爽了,空气清新了,但我的项目生病了。。。。。。

 

项目采用Struts2+Spring2+ibatis2技术,已经上线一周时间,遇到致命的内伤,让我心悸让我忧。。。。。。

1.项目中使用C3P0作为数据库连接池,并利用Spring管理,其配置如下:

	<!-- c3p0连接池配置 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<!-- 用户名-->
		<property name="user" value="${username}"/>
		<!-- 用户密码-->
		<property name="password" value="${password}"/>
		<property name="driverClass" value="${driver_class}"/>
		<property name="jdbcUrl" value="${url}"/>
		<!-- 当连接池耗尽时候,一次获得连接数-->
		<property name="acquireIncrement" value="2"/>
		<!-- 连接池最大数 -->
		<property name="maxPoolSize" value="20"/>
		<!-- 连接池最小数-->
		<property name="minPoolSize" value="2"/>
		<!-- 初始化连接池大小 -->
		<property name="initialPoolSize" value="2"/>
		<!-- 当连接池连接耗尽时,客户端获取连接等待所需时间-->
		<property name="checkoutTimeout" value="3000"/>
		<!-- 当连接失效时,或得连接的次数,0为无限次(重连)-->
		<property name="acquireRetryAttempts" value="0"/>
	</bean>

2.项目采用Spring声明式事务管理,是使用BeanNameAutoProxyCreator自动生成事务代理的方式。配置如下:

<!--   配置事务拦截器  -->
<!-- 配置事务拦截器Bean -->  
    <bean id="transactionInterceptor"  
       class="org.springframework.transaction.interceptor.    
        TransactionInterceptor">  
        <property name="transactionManager" ref="transactionManager"/>  
       <property name="transactionAttributes">  
          <!-- 下面定义事务传播属性 -->  
           <props>    
                <prop key="*">PROPAGATION_REQUIRED</prop>  
           </props>  
        </property>  
   </bean>  
 
    <!-- 定义BeanNameAutoProxyCreator的Bean后处理器 -->  
   <bean class="org.springframework.aop.framework.autoproxy.    
    BeanNameAutoProxyCreator">  
        <property name="beanNames">   
            <list>  
                <value>transactionDAO</value>  
            </list>    
        </property>  
        <property name="interceptorNames">  
            <list>  
                <value>transactionInterceptor</value>    
           </list>  
        </property>  
    </bean> 

其中transactionDAO一个公共的DAO,封装了增加、删除、修改等操作,所以我只对该DAO做事务代理。

运行情况是:
刚开始的时候都非常好用,各个部件都运行正常,运行一两天就抛出如下异常:

1.
com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a 
resource from com.mchange.v2.resourcepool.BasicResourcePool@143073a -- timeout at 
awaitAvailable()

2.
org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; 
nested exception is java.sql.SQLException: An attempt by a client to checkout a Connection 
has timed out.

曾今有一个项目,一次性向数据库插入1W条数据,也采用了C3P0,未曾有数据库连接超时的问题。

 

各位道友,你们是否也遇到这样的问题,又是如何解决的呢?

 

   发表时间:2009-07-20  
这个是由于msyql的wait_timeout的设置, 如果在一定时间内mysql的connection没有使用的话mysql server会关闭掉connection的socket。 具体解决办法可以看参考我的这篇文章

http://dengyin2000.iteye.com/blog/417730
0 请登录后投票
   发表时间:2009-07-20  
项目使用的是Oracle

项目环境: tomcat5.5.27 + oracle10g + jdk1.5.0.07
0 请登录后投票
   发表时间:2009-11-16  
不知道兄弟最终如何解决的,遇到同样问题,真是头疼呀
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics