这几天北京下着雨,虽然天气凉爽了,空气清新了,但我的项目生病了。。。。。。
项目采用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,未曾有数据库连接超时的问题。
各位道友,你们是否也遇到这样的问题,又是如何解决的呢?