在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?
答案 0 :(得分:0)
出于性能原因,某些会话实现在mybatis中不是无状态的,它们包含本地缓存。
因此,虽然理论上可以将会话实现为连接的瘦包装并创建新的会话实例(每次需要时会从spring接收到绑定到当前事务的连接)会对性能造成影响观察缓存命中的场景。