一级缓存

Hibernate的一级缓存见解

主宰稳场 提交于 2019-11-29 21:19:17
Hibernate一级缓存: Hibernate中的一级缓存的理解,一共进行了三次查询。 第一次因为缓存中没有数据所以会去查询数据库,会发出sql语句; 第二次因为在同一个session中,所以可以使用hibernate的一级缓存,所以不发出sql语句(即没有查询数据库); 第三次因为hibernate的一级缓存只能在同一个session中共享数据,所以hibernate到数据库中去查询数据,会发出sql语句。 public void firstCacheOfSession(){ Test test = null; Session session = null; try { session = HibernateSessionFactory.getSession(); session.beginTransaction(); //第一次会发出sql语句,因为没有缓存中没有数据要去数据库中查询 test = (Test) session.get(Test.class, 1); System.out.println("first :"+test.getName()); //第二次不会发出sql语句,因为在同一个session中,可以到hibernate的一级缓存中取数据 test = (Test) session.get(Test.class, 1); System.out

Mybatis3.4.x技术内幕(二十二):Mybatis一级、二级缓存原理分析

↘锁芯ラ 提交于 2019-11-29 11:18:48
Mybatis的一级缓存,指的是SqlSession级别的缓存,默认开启;Mybatis的二级缓存,指的是SqlSessionFactory级别的缓存,需要配置。缓存是针对select来说的。 1、一级缓存 <configuration> <settings> <setting name="localCacheScope" value="SESSION|STATEMENT" /> </settings> </configuration> localCacheScope用于配置一级缓存的范围,默认值是SESSION,表示SqlSession范围; 如果配置为STATEMENT,则表示SqlSession范围内的一个查询范围,但它并不是一个Statement实例范围。 STATEMENT举例:查询Student对象发送一次sql查询,紧接着再发一次sql查询关联的Teacher对象,这个完整过程称之为一个查询。 一级缓存默认开启,且没有全局关闭的配置开关。 <select ... flushCache="false" useCache="true|false"/> flushCache:同时影响了一级、二级缓存,flushCache=true,会导致清空本条sql(当前MappedStatement)的一级、二级缓存,注意是当前的,不影响其他的MappedStatement。

Mybatis 缓存学习

蹲街弑〆低调 提交于 2019-11-28 14:27:47
引用 缓存就是存贮数据(使用频繁的数据)的临时地方,因为取原始数据的代价太大了,所以我可以取得快一些。 1、一级缓存与二级缓存的差异 1)二级缓存默认关闭,一级缓存默认开启,二级缓存以Mapper的namespace为单位,但是一级缓存以sqlsession为单位,如果采用Spring管理对象,那么每次一个事务就会有一个sqlsession。 2)二级缓存的读取都采用了锁控制并发,但是一级缓存并没有,而且Mybatis强调了sqlsession不应该多线程共享,看到这里确实是有道理的,第一个是sqlsession关闭了在使用会报错,其二是读写缓存数据都没有加锁;然而,二级缓存虽然是建立在一级缓存之上,但是二级缓存采用了SynchronizedCache缓存,对数据的读写都进行了加锁,整个二级缓存就是一个责任链模式,从 SynchronizedCache(读写加锁)——>LoggingCache(命中率记录)——>SerializedCache(缓存值序列化、反序列化)——>LruCache(移除无用缓存)——>PerpetualCache(一级缓存,缓存数据的存储); 3)二级缓存采用的Executor是BaseExecutor;二级缓存采用的Executor是CachingExecutor(内部委托BaseExecutor进行数据库操作); 2、一级缓存代码 if