mybatis一级缓存的问题

来源:1-1 Java高并发秒杀API之业务分析与DAO层课程介绍

朱小悬

2017-05-04 13:29

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

写回答 关注

2回答

  • 慕后端1009178
    2017-05-08 03:37:53

    关于缓存问题:

    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.


  • 慕后端1009178
    2017-05-08 03:30:27

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

    1,获取SqlSession对象

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

    3,提交事务

    4,关闭SqlSession

    朱小悬

    查询操作不需要提交事务吧?

    2017-05-09 14:10:27

    共 1 条回复 >

Java高并发秒杀API之业务分析与DAO层

Java实现高并发秒杀API的第一门课,还等什么,赶快来加入吧

87424 学习 · 496 问题

查看课程

相似问题