您的位置:首页 > 编程语言 > Java开发

Spring Jersey Mybatis Aop transaction事务失效解决方案SpringManagedTransaction will not be managed by Spring

2018-01-03 22:14 781 查看
整个项目的框架是Spring + Jersey + Mybatis, 事务是用Aop做的,不是用注解的形式,一直报这样的错误:

DEBUG: org.mybatis.spring.transaction.SpringManagedTransaction - JDBC Connection [ConnectionHandle{url=jdbc:postgresql://localhost/mypro, user=mypro, debugHandle=null, lastResetAgoInSec=92, lastUsedAgoInSec=92, creationTimeAgoInSec=92}] will not be managed by Spring


在网上找了很多方案,发现都没解决我的事务问题:

http://www.codingpedia.org/ama/restful-web-services-example-in-java-with-jersey-spring-and-mybatis/

http://powertech.iteye.com/blog/2312452

https://www.cnblogs.com/dingchenghong/p/4858552.html

上面的资料都试过了,用注解的形式,单独跑过第一个项目是可以的,但是我现在是维护原来的项目,如果把以前的项目都改成注解的形式,工作量也是够大,所以还是要用Aop事务来处理,我的项目大致结构是:

service 接口

serviceImpl 接口实现类,实现接口,所有类上都加有@Servcie和@Path的注解

dao 接口

application.xml文件扫描所有的类

spring-mybatis.xml 数据源事务配置

<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.xxxx.xx.service.*.*(..))" />

</aop:config>


刚开始配置文件是这样的,发现不管怎么试都不可以,还用

<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>


这个排除怀疑是service的重复扫描问题,还试了说是必须用@Component不能用@Service,来源:https://stackoverflow.com/questions/21104567/springjersey-transactional-annotation/24554236#24554236

但还是没有解决问题,还看来mybatis-spring的源码:

SpringManagedTransaction.java:

private void openConnection() throws SQLException {
this.connection = DataSourceUtils.getConnection(this.dataSource);
this.autoCommit = this.connection.getAutoCommit();
this.isConnectionTransactional = isConnectionTransactional(this.connection, this.dataSource);

if (this.logger.isDebugEnabled()) {
this.logger.debug(
"JDBC Connection ["
+ this.connection
+ "] will"
+ (this.isConnectionTransactional ? " " : " not ")
+ "be managed by Spring");
}
}


DataSourceUtils.java:

public static boolean isConnectionTransactional(Connection con, DataSource dataSource) {
if (dataSource == null) {
return false;
}
ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);
return (conHolder != null && connectionEquals(conHolder, con));
}


TransactionSynchronizationManager.java

public static Object getResource(Object key) {
Object actualKey = TransactionSynchronizationUtils.unwrapResourceIfNecessary(key);
Object value = doGetResource(actualKey);
if (value != null && logger.isTraceEnabled()) {
logger.trace("Retrieved value [" + value + "] for key [" + actualKey + "] bound to thread [" +
Thread.currentThread().getName() + "]");
}
return value;
}


发现通过Key,没有找到value

后来仔细看以前的配置文件,发现所有的事务都绑定在接口上了,我这里的事务要绑定在接口实现类上面,于是改成:

<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.xxxx.xx.service.impl.*.*(..))" />

</aop:config>


测试之后发现,还是不行,按照上面的思路,另外单独试验一个项目,就是把所有serviceImpl的实现接口的接口继承关系去掉,就是只有实现类serviceImpl,尽然发现奇迹成功了,于是想到之前有接触过proxy-target-class这个属性,当时记不太清,就是接口或者类的代理吧,于是查看资料,发现:

proxy-target-class属性值决定是基于接口的还是基于类的代理被创建。首先说明下proxy-target-class=”true”和proxy-target-class=”false”的区别,为true则是基于类的代理将起作用(需要cglib库),为false或者省略这个属性,则标准的JDK 基于接口的代理将起作用,proxy-target-class在spring事务、aop、缓存这几块都有设置,其作用都是一样的

茅塞顿开,于是把配置文件改成:

<aop:config proxy-target-class="true">
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.xxxx.xx.service.impl.*.*(..))" />

</aop:config>


居然大功告成了,先总结到,会继续补齐解决方案!

事务信息如下:

2018-01-03 22:12:12,144 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Initiating transaction commit>
2018-01-03 22:12:12,144 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering beforeCommit synchronization>
2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering beforeCommit synchronization>
2018-01-03 22:12:12,144 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Initiating transaction commit>
2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering beforeCompletion synchronization>
2018-01-03 22:12:12,144 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering beforeCompletion synchronization>
2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Committing JDBC transaction on Connection [HikariProxyConnection@930981891 wrapping com.mysql.jdbc.JDBC4Connection@6d8a1a40]>
2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Committing JDBC transaction on Connection [HikariProxyConnection@930981891 wrapping com.mysql.jdbc.JDBC4Connection@6d8a1a40]>
2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Initiating transaction commit>
2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering beforeCompletion synchronization>
2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCommit synchronization>
2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering beforeCommit synchronization>
2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Initiating transaction commit>
2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Initiating transaction commit>
2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering beforeCompletion synchronization>
2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering beforeCompletion synchronization>
2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Committing JDBC transaction on Connection [HikariProxyConnection@1838470215 wrapping com.mysql.jdbc.JDBC4Connection@2cb7107b]>
2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCommit synchronization>
2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Initiating transaction commit>
2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Initiating transaction commit>
2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCompletion synchronization>
2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Initiating transaction commit>
2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Committing JDBC transaction on Connection [HikariProxyConnection@1092608611 wrapping com.mysql.jdbc.JDBC4Connection@615fb0b7]>
2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Committing JDBC transaction on Connection [HikariProxyConnection@1092608611 wrapping com.mysql.jdbc.JDBC4Connection@615fb0b7]>
2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Committing JDBC transaction on Connection [HikariProxyConnection@1974184653 wrapping com.mysql.jdbc.JDBC4Connection@5c2d12c4]>
2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Committing JDBC transaction on Connection [HikariProxyConnection@1974184653 wrapping com.mysql.jdbc.JDBC4Connection@5c2d12c4]>
2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCommit synchronization>
2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCommit synchronization>
2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCommit synchronization>
2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCommit synchronization>
2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCompletion synchronization>
2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCompletion synchronization>
2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCompletion synchronization>
2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Committing JDBC transaction on Connection [HikariProxyConnection@1838470215 wrapping com.mysql.jdbc.JDBC4Connection@2cb7107b]>
2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCommit synchronization>
2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCommit synchronization>
2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCompletion synchronization>
2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCompletion synchronization>
2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCompletion synchronization>
2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCompletion synchronization>
2018-01-03 22:12:12,209 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Releasing JDBC Connection [HikariProxyConnection@930981891 wrapping com.mysql.jdbc.JDBC4Connection@6d8a1a40] after transaction>
2018-01-03 22:12:12,209 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Releasing JDBC Connection [HikariProxyConnection@930981891 wrapping com.mysql.jdbc.JDBC4Connection@6d8a1a40] after transaction>
2018-01-03 22:12:12,219 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Releasing JDBC Connection [HikariProxyConnection@1974184653 wrapping com.mysql.jdbc.JDBC4Connection@5c2d12c4] after transaction>
2018-01-03 22:12:12,219 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Releasing JDBC Connection [HikariProxyConnection@1974184653 wrapping com.mysql.jdbc.JDBC4Connection@5c2d12c4] after transaction>
2018-01-03 22:12:12,223 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Releasing JDBC Connection [HikariProxyConnection@1092608611 wrapping com.mysql.jdbc.JDBC4Connection@615fb0b7] after transaction>
2018-01-03 22:12:12,223 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Releasing JDBC Connection [HikariProxyConnection@1092608611 wrapping com.mysql.jdbc.JDBC4Connection@615fb0b7] after transaction>
2018-01-03 22:12:12,225 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Releasing JDBC Connection [HikariProxyConnection@1838470215 wrapping com.mysql.jdbc.JDBC4Connection@2cb7107b] after transaction>
2018-01-03 22:12:12,225 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Releasing JDBC Connection [HikariProxyConnection@1838470215 wrapping com.mysql.jdbc.JDBC4Connection@2cb7107b] after transaction>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐