onlyliuxin/coding2017

7.23因为Mybatis的一级缓存,而引起一系列的疑问

Opened this issue · 0 comments

问题描述:今天在研究Mybatis 的一级缓存与二级缓存的定义与测试 的时候引发了一系列的思考,我还是个大四软工,知识相对于各位大大来说比较浅薄,希望有大大可以解答。

  1. 问题1:当Spring与Mybatis 整合之后,如何理解一个Sqlsession的生命周期?

    ## 为什么我会这么问呢,因为我发现 MyBatis官方对自带的一级缓存的定义是

  • Mybatis一级缓存是指在内存中开辟一块区域,用来保存用户对数据库的操作信息(sql)和数据库返回的数据,如果下一次用户再执行相同的请求,那么直接从内存中读数数据而不是从数据库读取。

  • 而一级缓存的设计是每个sqlsession单独使用一个缓存空间,不同的sqlsession是不能互相访问数据的。当然,在sqlsession关闭后,其中数据自然被清空。

  • 然后我今天就做了如下测试,在三个不同的浏览器下,对自己的测试web项目的同一个url连接请求(除了浏览器不同,其他条件完全一样)。使用log4j-debug模式下进行日志巡查。发现当且仅有第一次查询,他才会从数据库里面拿数据,第2、3次都是从缓存里面拿数据,而且,每次查询请求,他控制台显示,都会create a new Sqlsession 。

  • 第二个测试,基于JunitTest多线程测试,test代码如下
    ` @test
    public void firstTest() {

      TestRunnable runnable = new TestRunnable() {
          @Override
          public void runTest() throws Throwable {
              regionService1.findList(new Region());
          }
      };
    
    
      TestRunnable[] trs = new TestRunnable[3];
      for (int i = 0; i < 3; i++) {
          trs[i] = runnable;
    
      }
    
      MultiThreadedTestRunner mttr = new MultiThreadedTestRunner(trs);
      try {
          mttr.runTestRunnables();
    
      }catch (Throwable a){
          a.printStackTrace();
      }
    

    }`

  • 从log4j的日志来看,我发现他 create a new Sqlsession 三次 并且每次都是从数据库里面拿数据

    现在我有点迷了,当spring与mybatis整合之后,怎么样才算一个新的sqlsession。一个request请求是一个线程的话,那么线程和SqlSession的关系是怎么样的

(后面的疑问再慢慢更新)