Hibernate的缓存机制

缓存:缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。缓存的数据是在内存中的。
优点:响应数据快
分为一级缓存二级缓存查询缓存

一级缓存:默认开启
作用范围:session级缓存,在一个session的生命周期(缓存的是对象,不是集合

//一级缓存(查询的数据要一样)
  City city = session.get(City.class, 1);
  System.out.println(city.getCname());
  /*
  //如果在中间关闭session,它就不是一级缓存
  session.close();
  session = factory.openSession();
 */
  City city2 = session.get(City.class, 1);
  System.out.println(city2.getCname());

这是一级缓存,第二次查询的时候,它先内存中找,然后内存中有,就直接拿内存中的,就不会去数据库中查

Hibernate: 
    select
        city0_.CID as CID1_0_0_,
        city0_.CNAME as CNAME2_0_0_,
        city0_.pid as pid3_0_0_ 
    from
        CITY city0_ 
    where
        city0_.CID=?
长沙市
长沙市

这不是一级缓存,他还是去数据库查询了两次

select
        city0_.CID as CID1_0_0_,
        city0_.CNAME as CNAME2_0_0_,
        city0_.pid as pid3_0_0_ 
    from
        CITY city0_ 
    where
        city0_.CID=?
长沙市
Hibernate: 
    select
        city0_.CID as CID1_0_0_,
        city0_.CNAME as CNAME2_0_0_,
        city0_.pid as pid3_0_0_ 
    from
        CITY city0_ 
    where
        city0_.CID=?
长沙市

二级缓存:需要手动打开(在hibernate.cfg.xml中配置打开)
作用范围:SessionFactory级缓存,工厂不关闭,缓存就一直在。(缓存的也是对象,不是集合)
在配置文件中
pom.xml

<!-- 二级缓存的配置 -->
   <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-ehcache -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-ehcache</artifactId>
    <version>5.3.10.Final</version>
</dependency>

hibernate.cfg.xml

<!-- 打开二级缓存 -->
        <property name="hibernate.cache.use_second_level_cache">true</property>
        <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.internal.EhcacheRegionFactory</property>
        <!-- 指定哪个实体类用二级缓存-->
         <class-cache usage="read-only" class="com.ywy.entity.City"/>
//二级缓存
  City city = session.get(City.class, 1);
  System.out.println(city.getCname());
  //如果session关闭它还是有
  session.close();
  session = factory.openSession();
  City city2 = session.get(City.class, 1);
  System.out.println(city2.getCname());
//二级缓存---把工厂关闭就没有,就去数据库查询两次
  City city = session.get(City.class, 1);
  System.out.println(city.getCname());
  //关闭工厂
  transaction.commit();
  session.close();
  //获取工厂
  factory=configuration.buildSessionFactory();
  session = factory.openSession();
  transaction = session.beginTransaction();
  City city2 = session.get(City.class, 1);
  System.out.println(city2.getCname());

查询缓存
对一个查询对象的缓存(可以缓存对象和集合)
hibernate.cfg.xml

<!-- 打开查询缓存-->
 <property name="hibernate.cache.use_query_cache">true</property>

  String hql="select c from City c";
  Query query=session.createQuery(hql);
  //手动打开查询缓存(只能单独设置的一个查询对象)
  query.setCacheable(true);
  List<City> list=query.list();
  for (City city : list) {
    System.out.println(city.getCname());
  }
  Query query2 = session.createQuery(hql);
  List<City> list2=query.list();
  
  for (City city : list2) {
   System.out.println(city.getCname());
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值