MyBatis 源码解析SqlSession.getConnection(Connection异常:关闭或者不在Mybatis事务)

从SqlSession的实现类SqlSessionTemplate源码中,看出相关方法被其内部类SqlSessionInterceptor(实现了InvocationHandler)代理

当调用SqlSessionTemplate.getConnection()时,有SqlSessionInterceptor代理执行,从SqlSessionInterceptor源码中看到其invoke方法finally代码块那内容如:

//关闭SqlSession

 

导致获取到的Connection中delegate(委托)的holder(存放事务对象)为空

 

解决方案:

抽离代理,将代理方法SqlSessionInterceptor.invoke中的代码拿出直接使用

SqlSessionTemplate st = (SqlSessionTemplate) getSqlSession();

Connection connection = SqlSessionUtils.getSqlSession(
                st.getSqlSessionFactory(), st.getExecutorType(),
                st.getPersistenceExceptionTranslator()).getConnection();

这样获取到的Connection可以正常使用

posted @ 2018-08-02 15:53  Mr.Zhongzz  阅读(1364)  评论(0)    收藏  举报