• Hibernate缓存


    概念:

    1.什么是缓存呢?

       缓存:是计算机领域的概念,它介于应用程序和永久性数据存储源之间。

       缓存:一般人的理解是在内存中的一块空间,可以将二级缓存配置到硬盘。用白话来说,就是一个存储数据的容器。我们关注的是,哪些数据需要被放入二级缓存。

       作用:降低应用程序直接读写数据库的频率,从而提高程序的运行性能。缓存中的数据是数据存储源中数据的拷贝。缓存的物理介质通常是内存。

    2.缓存在软件系统中的位置

     

    3.hibernate的缓存一般分为几种?

      分为三种:一级缓存,二级缓存和查询缓存

    4.一级缓存

        01.session内的缓存即一级缓存,内置且不能被卸载,一个事务内有效。在这个空间存放了相互关联的Java对象,这种位于session缓存内的对象也别称为持久化对象,session负责根据持久化对象的状态变化来同步更新数据库。

        02.session为应用程序提供了管理缓存的方法:evict(Object o)和clear()

        03.一级缓存结论

           一级缓存的生命周期和session的生命周期一致,当前session一旦关闭,一级缓存就消失了,因此一级缓存也叫session级的缓存或事务级缓存,一级缓存只存实体对象,它不会缓存一般的对象属性(查询缓存可以),即当获得对象后,就将该对象缓存起来,如果在同一session中再去获取这个对象时,它会先判断在缓存中有没有该对象的id,如果有则直接从缓存中获取此对象,反之才去数据库中取,取的同时再将此对象作为一级缓存处理。

        04.以下方法支持一级缓存

            * get()    

            * load()    

            * iterate(查询实体对象)

             其中 Query 和Criteria的list() 只会缓存,但不会使用缓存(除非结合查询缓存)。

     

    5.二级缓存

       01.二级缓存是进程(N个事务)或集群范围内的缓存,可以被所有的Session共享,在多个事务之间共享。

        02.二级缓存是可配置的插件

       03.二级缓存的散装数据

     

    注意:如果缓存中的数据采用对象的散装数据形式,那么当不用的事务到缓存中查询OID为1的Customer对象时,获得的是Customer对象的散装数据,每个事务都必须分别根据散装数据重新构造出Customer实例,也就是说,每个事务都会获得不同的Customer对象。

       04.二级缓存机制

     

       05.二级缓存分为:类级别缓存,集合级别缓存,更新时间戳和查询缓存。

       06.二级缓存的散装原理图

     

        07.类级别的二级缓存只适用于get和load获取数据,对query接口的list()可以将数据放置到类级别的缓存中,但不能使用query接口的list()从缓存中获取数据。

       08.注意点:修改一级缓存的数据,会自动同步到二级缓存。

       09.二级缓存结论

           二级缓存也称进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有session共享,二级缓存的生命周期和SessionFactory的生命周期一致。hibernate为实现二级缓存,只提供二级缓存的接口供第三方实现。二级缓存也是缓存实体对象,原理和方法都与一级缓存差不多,只是生命周期有所差异。

    6.查询缓存

         01.查询是数据库技术中最常用的操作,Hibernate为查询提供了缓存,用来提高查询速度,优化查询性能相同HQL语句检索结果的缓存!

         02.查询缓存依赖于二级缓存,查询缓存是针对普通属性结果集的缓存,对实体对象的结果集只缓存id(其id不是对象的真正id,可以看成是HQL或者SQL语句,它与查询的条件相关即where后的条件相关,不同的查询条件,其缓存的id也不一样)。查询缓存的生命周期,当前关联的表发生修改或是查询条件改变时,那么查询缓存生命周期结束,它不受一级缓存和二级缓存生命周期的影响,要想使用查询缓存需要手动配置。

    7.结论

         不要想当然的以为缓存可以提高性能,仅仅在你能够驾驭它并且条件合适的情况下才是这样的。hibernate的二级缓存限制还是比较多的。在不了解原理的情况下乱用,可能会有1+N的问题。不当的使用还可能导致读出脏数据。 如果受不了hibernate的诸多限制,那么还是自己在应用程序的层面上做缓存吧。 

         在越高的层面上做缓存,效果就会越好。就好像尽管磁盘有缓存,数据库还是要实现自己的缓存,尽管数据库有缓存,咱们的应用程序还是要做缓存。因为底层的缓存它并不知道高层要用这些数据干什么,只能做的比较通用,而高层可以有针对性的实现缓存,所以在更高的级别上做缓存,效果也要好些吧。

          缓存是位于应用程序与物理数据源之间,用于临时存放复制数据的内存区域,目的是为了减少应用程序对物理数据源访问的次数,从而提高应用程序的运行性能.      Hibernate在查询数据时,首先到缓存中去查找,如果找到就直接使用,找不到的时候就会从物理数据源中检索,所以,把频繁使用的数据加载到缓存区后,就可以大大减少应用程序对物理数据源的访问,使得程序的运行性能明显的提升. 

  • 相关阅读:
    命名是个技术活(转)
    我想知道的是这个月哪种商品销售量最高,比上个月怎么样?销量近几个月的走势是什么?有没有未达标的?有没有超额完成的?超额完成了多少?我可不关心这个月到底售出了多少件,几点售出的,谁买的(转)
    一个demo
    oracle 创建字段自增长——两种实现方式汇总(转)
    Ruby 一些经常使用的细节
    CMap与hash_map效率对照
    Unity 4.5.2 for Mac 下载+安装+破解
    Android中View绘制流程以及invalidate()等相关方法分析
    Android Studio 100 tips and tricks
    JavaScript-2.2 document.write 输出到页面的内容
  • 原文地址:https://www.cnblogs.com/yangsongxiao/p/6380522.html
Copyright © 2020-2023  润新知