浅析Hibernate框架之一级缓存原理

1.Hibernate一级缓存

    Hibernate一级缓存也叫Session级别的缓存,即每打开一个Session,就意味着打开了一个Session级别的缓存区域,Session和Session之间的数据不能共享(二级缓存除外),当进行CRUD操作时,都会影响到一级缓存区域(即会将对应数据存到一级缓存区域中),当再次查询时会直接从缓存区域获取对象,当关闭Session或清除缓存时,Session中的对象就会由持久态转化为托管态(游离态)。

2.一级缓存的原理

         当进行CRUD操作时,都会将数据加载到一级缓存缓存区和快照区,当再次进行查询时,会先去缓存区查找,如果缓存区存在数据则直接返回给客户端,如果不存在则向数据库发送SQL语句进行数据查询,并将数据加载到Session缓存区中,再由Session缓存区将数据返回给客户端。

    当进行持久化对象的改变,会自动修改缓存区域的数据,因为执行commit之前默认有一个flush操作,flush操作会对比一级缓存区域数据和快照区数据,若发现数据不一致(先同步快照区),然后自动触发SQL至数据库,当commit之后将同步数据库使数据保持一致(即一级缓存有自动更新数据库的能力),修改数据建议使用快照


3.一级缓存注意事项

       注意点1:

         当进行save操作时,hibernate会直接在save操作时向数据库发送SQL语句,原因是要去数据库申请一个id

       案例测试1-1: 建议debug

        

    测试结果:

        

        注意点2:

           Hibernate 没有任何识别 SQL的能力,Hibernate能做的只是拼接SQL,从缓存区拿数据的时候,hibernate并不知道你到底查询的是什么样的数据,所以无法从一级缓存中获取数据,在操作时只是把结果放入一级缓存中,若通过id去查询,是可以查到缓存区已经存在的数据,以下例子为如何证明hibernate没有识别的sql的能力?验证方式-两次hql 语句是否都会都会触发sql语句?

 案例测试2-1:判断hibernate 是否有识别HQL语句的能力

      

    测试结果:触发了两条SQL语句,说明第二次查询不是从缓存中直接获取,而是直接向数据库发送SQL语句

      

案例测试2-2:判断hibernate 是否有识别SQL语句的能力

    

测试结果:触发了两条SQL语句,说明第二次查询不是从缓存中直接获取,而是直接向数据库发送SQL语句

    

案例测试2-3:判断hibernate 是否有识别QBC语句的能力

    

测试结果:触发了两条SQL语句,说明第二次查询不是从缓存中直接获取,而是直接向数据库发送SQL语句

    

案例测试2-4:虽然hibernate没有识别SQL的能力,但是会将数据存入到缓存区,并可以通过id直接获得数据

    

测试结果:只向数据库发送了一条SQL语句

    

总结:以上仅代表个人理解到的点,欢迎批评指正!

猜你喜欢

转载自blog.csdn.net/qq_42673900/article/details/81042499