同一个sqlsession对象调用同一个标签,第一次访问数据库,把sql结果缓存到sqlsession缓存区中,之后在访问都是访问缓存区
当两次执行sql标签 日志中只会显示一次访问数据库操作 访问缓存的都不会被记录可以看到下面的控制台只有一次记录
先去内存的缓存区看有没有要查的,没有就去数据库,再把结果缓存
不同的SQL session对象是有不用的缓存空间的 没法交互的访问
即使是访问同一个标签,不同的SQLSession控制台会有两条记录
-
以上讨论的是在一个servlet下
1.同一SQL session调用相同标签 可以缓存
2.不同sqlsession即使调用相同标签 也无法共享缓存 -
现在问题升级—》不再同一次servlet下了
-
访问一次servlet创建一个SqlSession 如果访问两遍Servlet 又new了个新的SQL session 那刚才的缓存就没了
-
有没有什么级别是贯穿整个程序 访问几遍servlet都没变得呢?
-
factory
二级缓存(factory的缓存)开启,缓存范围是factory了
在当前的namespace命名空间下所有的查询都放在二级缓存里面
readOnly=ture允许访问
开启之后前面的不同的SQL session对象即使操作统一标签也会又两条记录现在就只有一个记录了
二级缓存和每个sqlseesion的缓存是独立的
每个sqlsession(上面的两个小圈圈)对应着一个自己的sqlseesion缓存( 下面的两个小圈圈) 当sqlsession提交了结束了之后才会把缓存复制到二级缓存factory当中
- 把第一个SQLsession的close()注释掉 二级缓存区就没有记录 第二次再访问的时候就访问数据库 因为缓存没有