Hibernate-缓存

Hibernate的对象三种状态

1.瞬时状态 Transient

持久化对象没有id,而且没有和session关联

2.持久状态 persistent

持久化对象有id,而且跟session有关联

3.游离状态(托管状态) detached

持久化对象有id,但是跟session没有关联

Hibernate缓存

1.缓存概念

     1.缓存就是一块内存区域。介于应用程序和物理数据源(例如:电脑磁盘)之间
     2.提高程序的运行速率, 从而提高了用户的体验度。
     3.缓存就是目标数据源的一个复本(复制)。应用程序直接访问缓存。一般会在特定时间刷新缓存。

2.Hibernate缓存

持久化层(dao层),对数据(操作的数据库中的数据)的备份

2.1 Hibernate一级缓存(Session级别)
Session级别的缓存:Hibernate内置的,不能卸除。如果session关闭了,缓存就清空了。
​
适用情况: 一次业务功能操作内有多次操作数据库。只访问一次,后续访问的是缓存数据。

案例1:以查询为例:
结论:
     使用session多次查询。只要查询都会将查询的结果存储到缓存区域。那下次再查询直接从缓存中查找,找到就直接获取,没有找到再次发起sql去连接数据库查询

案例: 快照
快照也是一块内存区域。快照是session缓存中一部分。
快照的目的是在提交事务的时候,会比较缓存和快照内容。
2.2Hibernate实现二级缓存的步骤:
 1.添加二级缓存的包(下载的库/lib/optional/ehcache/xx.jar(3个))
 2.在主配置文件(hibernate.cfg.xml)配置开启二级缓存
    <!--配置开启二级缓存  -->
     <property name="hibernate.cache.use_second_level_cache">true</property>
 <!-- 指定使用哪个二级缓存(Hibernate二级缓存有5种实现,Ehcache常用的一种) --> 
   <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property> 
   3.配置缓存的配置文件 ehcache.xml(hibernate提供了,开发者只需要根据自己的需求更改缓存目录及内容即可)
   ehcache.xml该文件的位置:hibernate下载的库/project/etc/ehcache.xml
         关键代码如下:
             <!--配置缓存的磁盘目录(该目录要存在)  -->
              <diskStore path="C:hibernatecache"/>
 
                <!-- name:指明要缓存的持久化类:包名+类名 -->
                <cache name="com.qf.domain.Customer"
                    maxElementsInMemory="10000"
                    eternal="false"
                    timeToIdleSeconds="300"
                    timeToLiveSeconds="600"
                    overflowToDisk="true"
                    />
​
4.在缓存的持久化类映射的地告诉程序缓存的策略
           ready-only  默认的,常用的,缓存数据无需修改,只需要读取即可。
           read-write  需要修改缓存数据,常用于对缓存进行读和写。数据库隔离级别不能为serializable(可串行化)
           notstrict-read-write 只是偶尔更新数据。(示例:两个事务同时更新一条数据,非常该策略。)
           transaction:ehcache不支持。
    示例:以下配置映射文件中的class的里面
    <!--设置缓存策略  -->
      <cache usage="read-only"/>
     5.验证测试:

 二级缓存和一级缓存的关系:
  默认使用一级缓存,当一级缓存不存在的情况下,去读取二级缓存。
  可以认为:二级缓存是一级缓存的补充。
 
重要的信息优先在一级缓存存储,不太重要的信息在二级缓存。
 二级缓存通常用于什么情况?
  不太重要的信息。
 很少被修改的数据。
   常量数据。   
  补充:一级缓存Session级别.如何清除一级缓存: 
   1.evict(Object o) 
    2.clear() 
    3.close()    
    二级缓存SessionFactory级别,如何清除二级缓存:
   1.sessionFactory.close()   
   2.把缓存文件删除(不建议)
原文地址:https://www.cnblogs.com/a77355699/p/7905919.html