`
m635674608
  • 浏览: 5027306 次
  • 性别: 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应用中,事务管理和多线程是两个非常关键的特性,特别是在处理复杂的业务逻辑时。本示例将深入探讨如何使用注解来实现事务控制以及如何在Spring Boot中运用多线程。 首先,让我们关注"注解事务"。在...

    MyBatis 3.5.9 官方html文档 包含MyBatis-Spring插件官方文档

    6. **MyBatis-Spring的SqlSessionTemplate和SqlSessionDaoSupport**:这两个类为MyBatis提供了Spring事务管理的支持,SqlSessionTemplate是线程安全的,可以直接在业务逻辑中使用;SqlSessionDaoSupport则是一个抽象...

    Java面试专属视频

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

    Spring Security:Java应用安全的守护神

    4. **多线程**:Java内置了对多线程编程的支持,允许开发者创建同时执行的多个线程。 5. **网络编程**:Java提供了丰富的网络通信API,使得开发网络应用变得容易。 6. **安全性**:Java提供了一个安全

    启动革命:Spring Boot如何简化Java应用的启动

    4. **多线程**:Java内置了对多线程编程的支持,允许开发者创建同时执行的多个线程。 5. **网络编程**:Java提供了丰富的网络通信API,使得开发网络应用变得容易。 6. **安全性**:Java提供了一个安全

    简单注解实现集群同步锁(spring+redis+注解)

    这种方式可以帮助开发者在多服务器环境中处理并发问题,避免数据竞争,确保数据的一致性。文章提到的关键点包括两个自定义注解:`@P4jSyn` 和 `@P4jSynKey`,以及相关的锁机制。 【自定义注解详解】 1. **`@P4jSyn...

    技术文档JAVAspring

    这是为了性能和线程安全考虑,避免字符串的修改带来不必要的内存复制。String对象常驻于常量池,便于重复使用和节省内存。在Spring框架中,字符串常用于构建SQL语句、配置文件等,理解其特性和不可变性对于优化代码...

    Java面试框架高频问题2019

    **问题十二:Spring如何处理线程并发问题?** - 使用`@Async`注解进行异步调用。 - 利用Spring提供的ThreadLocal实现线程安全。 **问题十三:为什么要有事物传播行为?** - 为了确保在嵌套事务中正确处理事务边界...

    atomikos 事物管理器

    5. **多线程与并发控制**:在多线程环境下,Atomikos 提供了高级的并发控制机制,保证了事务的隔离性和一致性。 6. **事务超时与死锁检测**:Atomikos 包含了自动的事务超时检测和死锁检测机制,能够及时发现并解决...

    my三期教程.txt

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

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

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

    Java高级工程师简历模板

    6.熟练掌握SSM等框架使用,熟悉spring IOC ,springAop springs事物核心源码,阅读过springmvc请求流程核心源码以及springboot自动装配原理;7.熟练掌握SQL语言,熟练使用Oracle、MySQL数据库进行javaEE开发,基本的...

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

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

    java面试题从java基础到spring

    适合在多线程环境中使用。 - **StringBuilder**: 与 StringBuffer 类似,但不是线程安全的,因此在单线程环境中性能更高。 #### 12. 创建字符串对象的面试题 - `String s1 = "A" + "hello";`: 这里的字符串拼接...

    09-5基于注解方式的声明式事务.rar

    在Java编程中,事务管理对于确保数据的一致性至关重要,特别是在多线程环境和并发操作中。 2. **Spring事务管理** Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理需要开发者手动...

    java面试宝典

    此宝典可能包含Java语言的基础概念、面向对象编程、集合框架、异常处理、多线程、网络编程、I/O流、数据库操作、设计模式等核心知识点。同时,它可能还会涵盖JVM原理、性能优化、Spring框架、MyBatis、微服务等相关...

    2024java面试题

    ### 2024 Java面试题详解 #### 一、Java基础知识 ...以上内容覆盖了2024年Java面试中可能出现的基础知识、面向对象编程、集合框架、多线程与并发编程、JVM与性能优化、设计模式以及Spring框架等多个方面的知识点。

    Java Core及底层面试问题.pdf

    ### Java Core及底层面试...通过以上总结,我们可以看到Java不仅是一门语言,更是一个强大的工具集,涵盖了从面向对象设计、多线程编程到并发控制等多个方面。掌握这些知识点对于成为一名合格的Java开发者至关重要。

    Spring Cloud Hystrix 服务容错保护的原理实现

    为了解决这些问题,需要采取相应的解决方案,例如自动扩容、限流模块、多机房灾备、跨机房路由、线程隔离、熔断器等机制。 在开始使用Spring Cloud Hystrix断路器之前,我们需要构建一个服务调用关系,包括服务消费...

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

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

Global site tag (gtag.js) - Google Analytics