我有一个使用mybatis作为持久层的宁静服务。我使用SqlSessionTemplate。现在进行测试,我在Maven的嵌入式tomcat中启动战争,然后与我的测试共享上下文。所以他们可以使用相同的数据库连接。我希望测试可以在交易中完成。对于每个测试场景,数据在开始时进行设置,在测试后进行回滚。同时,我使用SingleConnectionDataSource作为数据源,因此所有会话将共享相同的数据库连接。
但我发现,因为宁静的服务是多线程的。事实证明每个会话都在一个线程中,因此需要关闭SqlSession,因此会话强制提交连接。只是想知道如何避免提交?
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;
这是SqlSessionInterceptor的代码,你可以看到它检查isSqlSessionTransactional(),然后强制sqlSession提交。