链接MySQL数据库出现CannotCreateTransactionException
来源:互联网 发布:彩票销售软件 编辑:程序博客网 时间:2024/06/07 21:07
上线应用链接MySQL数据库时出现如下异常信息:
org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception iscom.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.net.SocketException
MESSAGE: Connection reset
STACKTRACE:
java.net.SocketException: Connection reset
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:96)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2637)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1554)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3170)
at com.mysql.jdbc.Connection.setAutoCommit(Connection.java:5273)
at org.apache.commons.dbcp.DelegatingConnection.setAutoCommit(DelegatingConnection.java:331)
at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.setAutoCommit(PoolingDataSource.java:317)
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:203)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:322)
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:255)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:102)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:176)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:615)
at com.alibaba.intl.ae.biz.wsproduct.product.service.impl.WsProductServiceImpl$$EnhancerByCGLIB$$3c743538.findWsproductById(<generated>)
从异常信息可以看出是DBCP链接池中的链接的通信异常了。
如果我们将数据链接池切换为Jboss的JNDI链接,该异常就不再出现了,故一探究竟。
在上网查询信息,发现MySQL有一个空闲链接的参数,默认值是28800(8小时),可以通过show global variables like 'wait_timeout'语句在MySQL数据库里查询。但其实发现出现上述异常信息,大概5分钟就会出现,而不需要8小时。而线上生产环境的机器是通过F5链接数据库集群的,而F5的链接超时时间是5分钟,这就解决了为什么5分钟左右就会出现通信异常而不是8小时了。
那么推测出就是DBCP链接池的失效时间大于了5分钟,导致F5断掉了链接,而JNDI的链接失效时间是小于5分钟的,所以应用从JNDI拿到链接都是有效的链接,从而不会抛出文章开头的异常信息。
那么DBCP和JNDI的最大闲置时间在那里配置的呢?
查看了线上生产环境的代码,DBCP在Spring的配置文件里面配置,配置如下:
<bean id="dbcpDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" abstract="true">
<property name="maxActive" value="10" />
<property name="maxIdle" value="4" />
<property name="minIdle" value="0" />
<property name="maxWait" value="100000" />
<property name="timeBetweenEvictionRunsMillis" value="600000" />
<property name="minEvictableIdleTimeMillis" value="300000" />
</bean>
timeBetweenEvictionRunsMillis的值就是配置的DBCP的最大闲置时间,线上配置的是600000毫秒,即10分钟。
JNDI的线上配置如下:
<min-pool-size>0</min-pool-size>
<max-pool-size>20</max-pool-size>
<blocking-timeout-millis>5000</blocking-timeout-millis>
<idle-timeout-minutes>3</idle-timeout-minutes>
<prepared-statement-cache-size>50</prepared-statement-cache-size>
idle-timeout-minutes的值就是配置JNDI的最大闲置时间,单位为分钟,线上配置为3分钟。
参考文章:
http://www.iteye.com/topic/550296
http://www.iteye.com/topic/569864
http://episode.iteye.com/blog/323244
http://blog.csdn.net/windy26205/article/details/6572724
最近遇到过这个问题,所以把文章转载到这里了,但是我的这个问题还是没有找到原因,之后会在查找问题的
- 链接MySQL数据库出现CannotCreateTransactionException
- PHP+IIS8+MySql出现的数据库链接错误
- 链接mysql数据库出现Unknown character set: 'utf8mb4'问题
- 关于powerdesigner链接Mysql数据库和出现的问题解决方案
- 在使用 Navicat for MySQL 链接数据库的时候出现链接异常;
- Eclipse链接MySQL数据库
- java链接mysql数据库
- JAVA链接Mysql数据库
- android 链接mysql数据库
- android 链接mysql数据库
- Eclipse链接MySQL数据库
- c#链接MySQL数据库
- C#链接Mysql数据库
- MYSQL数据库的链接
- 链接mysql数据库
- vs2008链接mysql数据库
- JSP链接mysql数据库
- java链接mysql数据库
- poj——2230——Watchcow(欧拉路+dfs)
- ASP.NET学习篇之——初识框架
- 使用structs2的拦截器判断用户权限的操作
- codeblocks快捷键
- (多项式运算4.7.6)POJ 2527 Polynomial Remains(多项式除法)
- 链接MySQL数据库出现CannotCreateTransactionException
- Android双向滑动菜单完全解析,教你如何一分钟实现双向滑动特效
- 集线器与交换机的区别
- 【C++进阶】类别互相引用(Class include each other)
- hdu 4089 Activation(概率dp)
- 僵尸进程《留给自己学着玩》
- Kinect for windows的脸部识别
- 修改MyEclipse eclipse 注释的作者名字
- Mac 可设置环境变量的位置、查看和添加PATH环境变量