mybatis-sqlSessionTemplate使用connection
在mybatis中想通过 connection 操作 PrepareStatement, 报了。当使用sqlSessionTemplate获取connection时,其内部是通过代理类。在最后 ,发现如果 sqlSession 不为空,就会关闭 sqlSession。
·
mybatis-sqlSessionTemplate使用connection
场景
在mybatis中想通过 connection 操作 PrepareStatement, 报了java.sql.SQLException: Connection is closed
这个错
原来是这样调用的
connection = sqlSessionTemplate.getConnection();
原因
当使用sqlSessionTemplate获取connection时,其内部是通过代理类SqlSessionInterceptor
实现
private class SqlSessionInterceptor implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
SqlSession sqlSession = getSqlSession(SqlSessionTemplate.this.sqlSessionFactory,
SqlSessionTemplate.this.executorType, SqlSessionTemplate.this.exceptionTranslator);
try {
Object result = method.invoke(sqlSession, args);
if (!isSqlSessionTransactional(sqlSession, SqlSessionTemplate.this.sqlSessionFactory)) {
// force commit even on non-dirty sessions because some databases require
// a commit/rollback before calling close()
sqlSession.commit(true);
}
return result;
} catch (Throwable t) {
Throwable unwrapped = unwrapThrowable(t);
if (SqlSessionTemplate.this.exceptionTranslator != null && unwrapped instanceof PersistenceException) {
// release the connection to avoid a deadlock if the translator is no loaded. See issue #22
closeSqlSession(sqlSession, SqlSessionTemplate.this.sqlSessionFactory);
sqlSession = null;
Throwable translated = SqlSessionTemplate.this.exceptionTranslator
.translateExceptionIfPossible((PersistenceException) unwrapped);
if (translated != null) {
unwrapped = translated;
}
}
throw unwrapped;
} finally {
if (sqlSession != null) {
closeSqlSession(sqlSession, SqlSessionTemplate.this.sqlSessionFactory);
}
}
}
}
在最后 ,发现如果 sqlSession 不为空,就会关闭 sqlSession
解决方案
//换成通过 SqlSessionUtils 获取
connection = SqlSessionUtils.getSqlSession(sqlSessionFactory).getConnection();

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)