在Mybatis中使用SqlSessionHolder做什么?

时间:2018-05-08 06:45:02

标签: mybatis spring-mybatis

在SqlSessionTemplate中,getSqlSession和closeSqlSession方法都是运行SqlSessionHolder,但我认为不是必须这样做,Spring管理器提供事务并提供ConnectionHolder,事务是关于连接的。

SqlSessionHolder holder = (SqlSessionHolder) getResource(sessionFactory);

if (holder != null && holder.isSynchronizedWithTransaction()) {
   if (holder.getExecutorType() != executorType) {
       throw new TransientDataAccessResourceException("Cannot change the ExecutorType when there is an existing transaction");
   }

   holder.requested();

   if (logger.isDebugEnabled()) {
      logger.debug("Fetched SqlSession [" + holder.getSqlSession() + "] from current transaction");
   }

   return holder.getSqlSession();
}

if (logger.isDebugEnabled()) {
  logger.debug("Creating a new SqlSession");
}

SqlSession session = sessionFactory.openSession(executorType);

为什么我们需要SqlSessionHolder?

1 个答案:

答案 0 :(得分:0)

出于性能原因,某些会话实现在mybatis中不是无状态的,它们包含本地缓存。

因此,虽然理论上可以将会话实现为连接的瘦包装并创建新的会话实例(每次需要时会从spring接收到绑定到当前事务的连接)会对性能造成影响观察缓存命中的场景。