如何避免在多线程上下文中提交mybatis sql会话

时间:2015-03-12 13:52:58

标签: java database mybatis

我有一个使用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提交。

0 个答案:

没有答案