hibernate一级缓存,二级缓存,三级缓存,缓存算法及配置。

    技术2026-08-16  15

    什么是缓存(我的理解):在内存中开辟一块空间,把原来在硬盘上的东西,放到内存当中,当需要用到一些数据时,直接在内存中查找,而不是到硬盘上查找。这块内存中的空间就是缓存。缓存能提高程序的运行效率。

    一级缓存( session 级的缓存):在一个 session 中 load 同一个对象 2 次, load 时, hibernate 首先在 session 缓存中查找对象,如果没找到就到数据库中去 load 。因此,在同一个 session 中 load 一个对象 2 次,只会发出一条 sql 语句。而在 2 个 session 中 load 同一个对象则会发送 2 次 sql 语句。

    二级缓存( session 的公用缓存, sessionFactory 级别的缓存, jvm 级缓存): hibernate 支持多种二级缓存, hibernate 提供了一个 HashTable ,用于测试,不建议运用与产品中。

    Hibernate 支持的 jvm 级的缓存有如下:

    org.hibernate.cache.HashtableCacheProvider (hibernate 自带的用于测试的2 级缓存。)

    org.hibernate.cache.EhCacheProvider

    org.hibernate.cache.OSCacheProvider

    org.hibernate.cache.SwarmCacheProvider

    org.hibernate.cache.TreeCacheProvider

    在hibernate 的配置文件中打开二级缓存如下:

            <!--

                                        打开并配置二级缓存

            -->

            < property name = "cache.use_second_level_cache" > true </ property >

     

      < property name = "cache.provider_class" > org.hibernate.cache.EhCacheProvider

    </ property >

    二级缓存适合放什么对象呢?

    ① 经常被访问(这个对象经常被访问,如果每次都到数据库去取,会降低效率)

    ② 改动不大(这个对象改动不大,如果改动较大,就可能造成缓存数据跟数据库中的数据不一致)

    在hibernate3.5.4中,这样的配置会出现一个问题。就是加上打开缓存的2句话,   

    sf=new AnnotationConfiguration().configure().buildSessionFactory();无法成功执行。问题还未解 决。用hibernate自带的org.hibernate.cache.HashtableCacheProvider则可以正常执行。  

     

    ③ 数量有限(如果这个类的对象太多,缓存就会很大。)

     

     

    三级缓存(查询缓存):如果要使 Query 使用二级缓存,则需要打开查询缓存。事实上,三级缓存是基于二级缓存的,如: list (集合),默认情况,它只会往二级缓存中存放数据,查找时不会搜索二级缓存,这是因为查询条件会随时变化。有一种情况就是 2 次查询的条件是一样的,这是要想使用二级缓存,就必须打开查询缓存,打开方式如:

    < property name = "cache.use_query_cache" > true </ property >

    然后加上: setCachable ( true )

     

    缓存算法有:

     

    LRU(Least Recently Used): 这种算法是在每个对象中维护一个访问的时间变量,每次访问后,时间都会更新,当新的对象需要存放到缓存时,替换那个按时间排序最后的对象。

    LFU(Least Frequently Used) :这种算法是每个对象记录了对象访问的次数(即命中率),当新的对象需要存放到缓存时,替换那个访问次数最少的对象。

    FIFO(First In First Out) :这种算法是将缓存中的对象存放成一个数组,当新的对象需要存放到内存中是,替换最先存放到缓存的对象。

    使用时通常在缓存配置文件中加入: MemoryStoreEvictionPolicy = "LRU"

    最新回复(0)