spring整合mybatis后,sqlSeesion被sprinhIoc容器管理起来。假如第一次查询数据库用到sqlSeesion1,第二次我还是进行相同的查询操作,Ioc容器会使用上次给我的sqlSession1(也就是使用缓存),还是会重新创建一个新的sqlSession。
关于缓存问题:
http://www.cnblogs.com/zemliu/archive/2013/08/05/3239014.html
执行了2次sql查询,看似我们使用了同一个sqlSession,但是实际上因为我们的dao继承了SqlSessionDaoSupport,而SqlSessionDaoSupport内部sqlSession的实现是使用用动态代理实现的,这个动态代理sqlSessionProxy使用一个模板方法封装了select()等操作,每一次select()查询都会自动先执行openSession(),执行完close()以后调用close()方法,相当于生成了一个新的session实例,所以我们无需手动的去关闭这个session()(关于这一点见下面mybatis的官方文档),当然也无法使用mybatis的一级缓存,也就是说mybatis的一级缓存在spring中是没有作用的.
官方文档摘要
MyBatis SqlSession provides you with specific methods to handle transactions programmatically. But when using MyBatis-Spring your beans will be injected with a Spring managed SqlSession or a Spring managed mapper. That means that Spring will always handle your transactions.
You cannot call SqlSession.commit(), SqlSession.rollback() or SqlSession.close() over a Spring managed SqlSession. If you try to do so, a UnsupportedOperationException exception will be thrown. Note these methods are not exposed in injected mapper classes.
会重新创建一个新的sqlSession,因为每次的数据库操作,一般都是以下四步:
1,获取SqlSession对象
2,调用数据库操作的方法
3,提交事务
4,关闭SqlSession