`
m635674608
  • 浏览: 4932634 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

spring 事物多线程问题

 
阅读更多
Dec 12, 2015 4:46:04 PM com.alibaba.druid.pool.DruidDataSource error
SEVERE: discard connection
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communications link failure during commit(). Transaction resolution unknown.
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
	at com.mysql.jdbc.Util.getInstance(Util.java:381)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
	at com.mysql.jdbc.ConnectionImpl.commit(ConnectionImpl.java:1552)
	at com.alibaba.druid.filter.FilterChainImpl.connection_commit(FilterChainImpl.java:180)
	at com.alibaba.druid.filter.stat.StatFilter.connection_commit(StatFilter.java:260)
	at com.alibaba.druid.filter.FilterChainImpl.connection_commit(FilterChainImpl.java:176)
	at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.commit(ConnectionProxyImpl.java:123)
	at com.alibaba.druid.pool.DruidPooledConnection.commit(DruidPooledConnection.java:718)
	at org.springframework.jdbc.datasource.DataSourceTransactionManager.doCommit(DataSourceTransactionManager.java:269)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:757)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:726)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:478)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:272)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644)
	at com.artbulb.img.service.impl.TemplateService$$EnhancerBySpringCGLIB$$4e8979d8.batchUpdateArtsGoodsByArtsIdTempId(<generated>)
	at com.artbulb.img.service.concurrent.ArtsReleaseGoodsCallable.call(ArtsReleaseGoodsCallable.java:217)
	at com.artbulb.img.service.concurrent.ArtsReleaseGoodsCallable.call(ArtsReleaseGoodsCallable.java:1)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
	at java.lang.Thread.run(Thread.java:662)
[DEBUG] 2015-12-12 16:46:04:994 SqlSessionUtils:289 - Transaction synchronization ended with unknown status for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3eb86609]
[DEBUG] 2015-12-12 16:46:04:994 SqlSessionUtils:298 - Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3eb86609]
[DEBUG] 2015-12-12 16:46:04:995 DataSourceTransactionManager:319 - Could not reset JDBC Connection after transaction
java.sql.SQLException: connection holder is null
	at com.alibaba.druid.pool.DruidPooledConnection.checkStateInternal(DruidPooledConnection.java:1107)
	at com.alibaba.druid.pool.DruidPooledConnection.checkState(DruidPooledConnection.java:1100)
	at com.alibaba.druid.pool.DruidPooledConnection.setAutoCommit(DruidPooledConnection.java:670)
	at org.springframework.jdbc.datasource.DataSourceTransactionManager.doCleanupAfterCompletion(DataSourceTransactionManager.java:314)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.cleanupAfterCompletion(AbstractPlatformTransactionManager.java:1012)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:807)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:726)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:478)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:272)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644)
	at com.artbulb.img.service.impl.TemplateService$$EnhancerBySpringCGLIB$$4e8979d8.batchUpdateArtsGoodsByArtsIdTempId(<generated>)
	at com.artbulb.img.service.concurrent.ArtsReleaseGoodsCallable.call(ArtsReleaseGoodsCallable.java:217)
	at com.artbulb.img.service.concurrent.ArtsReleaseGoodsCallable.call(ArtsReleaseGoodsCallable.java:1)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
	at java.lang.Thread.run(Thread.java:662)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communications link failure during commit(). Transaction resolution unknown.
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
	at com.mysql.jdbc.Util.getInstance(Util.java:381)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
	at com.mysql.jdbc.ConnectionImpl.commit(ConnectionImpl.java:1552)
	at com.alibaba.druid.filter.FilterChainImpl.connection_commit(FilterChainImpl.java:180)
	at com.alibaba.druid.filter.stat.StatFilter.connection_commit(StatFilter.java:260)
	at com.alibaba.druid.filter.FilterChainImpl.connection_commit(FilterChainImpl.java:176)
	at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.commit(ConnectionProxyImpl.java:123)
	at com.alibaba.druid.pool.DruidPooledConnection.commit(DruidPooledConnection.java:718)
	at org.springframework.jdbc.datasource.DataSourceTransactionManager.doCommit(DataSourceTransactionManager.java:269)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:757)
	... 16 more
[DEBUG] 2015-12-12 16:46:04:995 DataSourceTransactionManager:324 - Releasing JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@6f156508] after transaction

 

   一开始以为是一些数据库连接池,或者mysql的超时参数导致的,

然后各种参数都测试过,还报这个问题。

检查代码:

pool.submit(new ArtsReleaseGoodsCallable(artsInfo.getArtsId(), getProductPrint(), image,
					artsInfo.getDisplayWidth(), artsInfo.getDisplayHeight(), templateDAO,
					redis, templateService,cacheKey,isInsertGoods,idList));

 

  将service 中的由Spring管理的实例变量传入多线程中,然后在多线程中调用该实例变量相关方法。

  推理原因:

       1、 应该是主线程进入service,service 拿到当前线程上线文的数据库connection连接对象,

       2、在线程池中,有多个线程的缓存对象,线程上下文中引用的都是同一个connection。

       3、由于执行的时间比较久,当一个connection连接执行了超过一定时间就会报异常。

     

 切记:

  多线程中应该避免有状态的bean

  不要试图缓存数据库连接池中取出来的连接

  涉及到增删改的操作不要放到线程池中去执行

   

分享到:
评论

相关推荐

    spring boot注解事务+多线程

    spring boot 纯注解方法事务控制回滚,注解+简单配置文件使用多线程demo

    Java面试专属视频

    面试必考之HashMap源码分析与实现 ,微服务架构之Spring Cloud Eureka 场景分析与实战,高性能必学之Mysql主从架构实践 ,架构师不得不知道的Spring事物不能回滚的深层次原因 ,分库分表之后分布式下如何保证ID全局...

    my三期教程.txt

    并发编程与多线程 性能优化之JVM参数调优 性能优化之垃圾回收机制算法分析 性能优化之MySQL数据库性能优化 Mycat、sharding-jdbc 性能优化之Tomcat性能优化 设计模式与实战操作 框架核心原理分析 SpringIOC、AOP、...

    Java高级工程师简历模板18k+

    基本资料 教育背景 求职意向 专业技能 项目经验 工作经历 自我评价 ◆专业技能 1.具有扎实的Java基础,对面向对象编程有深刻的理解,...6.熟练掌握SSM等框架使用,熟悉spring IOC ,springAop springs事物核心

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【多线程】多线程的实现方式Thread、Runnable、Callable 72 【多线程】实现Runnable接口与继承Thread类比较 73 【多线程】线程状态转换 74 【多线程】线程的调度 75 线程优先级 75 sleep 76 wait 76 yield 77 join ...

    蚂蚁课堂(每特学院)第一期-Java高端培训视频教程

    教程目录: ├─0001-多线程快速入门.zip ├─0002-多线程之间实现同步.zip ├─0003--多线程之间通讯.zip ├─0004--Java并发编程.zip ├─0005--数据交换格式与SpringIOC底层实现.zip ├─0006--自定义注解与设计...

    2017卧底面试题答案解析.txt

    JAVA并发编程之多线程并发同步业务场景与解决方案 锁、分布式锁、无锁实战全局性ID 微服务架构之Spring Cloud Eureka 场景分析与实战 高性能必学之Mysql主从架构实践 架构师不得不知道的Spring事物不能回滚的深...

    java面试题

    答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式允许其service方法,一个实例可以服务于多个请求,并且其实例一般不会被销毁,而CGI对每个请求都产生新的进程,服务完后就销毁,所以效率上...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ │ 9.JAVA并发编程之多线程并发同步业务场景与解决方案.wmv │ │ │ ├─10.微服务架构之Spring Cloud Eureka 场景分析与实战 │ │ 10.微服务架构之Spring Cloud Eureka 场景分析与实战.wmv │ │ │ ├─11....

    Java-Interview-Offer

    多线程 线程的创造 线程的生命周期 线程的同步 死锁 新特性 网络编程 网络通信协议 TCP协议与UDP协议 数据库 关系型数据库 MySQL SQL语句 DML,DCL,DDL 事物 索引 非关系型数据库 阶段二:JavaWEB XML格式 WEB...

Global site tag (gtag.js) - Google Analytics