为了账号安全,请及时绑定邮箱和手机立即绑定

mybatis一级缓存的问题

spring整合mybatis后,sqlSeesion被sprinhIoc容器管理起来。假如第一次查询数据库用到sqlSeesion1,第二次我还是进行相同的查询操作,Ioc容器会使用上次给我的sqlSession1(也就是使用缓存),还是会重新创建一个新的sqlSession。

正在回答

2 回答

关于缓存问题:

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.


0 回复 有任何疑惑可以回复我~

会重新创建一个新的sqlSession,因为每次的数据库操作,一般都是以下四步:

1,获取SqlSession对象

2,调用数据库操作的方法

3,提交事务

4,关闭SqlSession

0 回复 有任何疑惑可以回复我~
#1

朱小悬 提问者

查询操作不需要提交事务吧?
2017-05-09 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

mybatis一级缓存的问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信