7.23因为Mybatis的一级缓存,而引起一系列的疑问
Opened this issue · 0 comments
问题描述:今天在研究Mybatis 的一级缓存与二级缓存的定义与测试 的时候引发了一系列的思考,我还是个大四软工,知识相对于各位大大来说比较浅薄,希望有大大可以解答。
-
问题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的关系是怎么样的
(后面的疑问再慢慢更新)