面试题解答系列:Hibernate中二级缓存使用和详解

73 篇文章 0 订阅
23 篇文章 0 订阅

通过优锐课核心java学习笔记中,我们可以看到分享了很多面试干货,码了很多专业的相关知识, 分享给大家参考学习。

一.简介

Gaving King曾经对别人说,hibernate最耀眼之处是hibernate的缓存机制。Hibernate为了降低应用程序对物理数据源的访问,使用了缓存机制。Hibernate缓存包括一级缓存和二级缓存。一级缓存又称"Session的缓存",是不能被卸载的。本文笔者为大家介绍的是Hibernate的二级缓存。

二.二级缓存

Hibernate的二级缓存又称为"SessionFactory的缓存",由于SessionFactory对象的生命周期和应用的整个过程对应,他是可选的,是一个可配置的插件,默认情况下SessionFactory不会启用这个插件。Hibernate5.2提供了org.

hibernate.cache.ehcache.EhCacheRegionFactory类,它充当缓存插件与Hibernate之间的适配器。

那么什么样的数据适合放在二级缓存中呢?

A.很少被修改的数据

B.不是很重要的数据

C.不会被并发访问的数据

C.常量数据

那么什么样的数据不适合放在二级缓存中呢?

A.经常被修改的数据

B.绝对不允许出现并发访问的数据。如财务数据,绝对不允许出现并发

C.与其他应用共享的数据

三.二级缓存的实现

3.1 hibernate.cfg.xml中加入以下配置

<!-- 是否开启二级缓存 -->
<property name="cache.use_query_cache">true</property>
        
<!-- 配置二级缓存的所需的类 -->
<property name="cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
        
<!-- 配置启用查询缓存-->
<property name="cache.use_query_cache">true</property>

复制代码

3.2 POJO类的注解形式实现
复制代码

@Entity
@Table(name="emp")
@Cacheable(value=true)
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
public class Employee {
@Id
@Column(name="empno")
@GenericGenerator(name="assignedGenerator", strategy="assigned")
@GeneratedValue(generator="assignedGenerator")
private int id;

@Column(name="ename")
private String ename;

@Column(name="job")
private String job;

@Column(name="hiredate")
private Date hiredate;

@Column(name="sal")
private Double salary;

@Column(name="comm")
private Double comm;

//setter and getter
}

复制代码

3.3 缓存文件

在src目录下建立一个文件,名字叫做encache.xml,文件的类容如下
复制代码

<cache name="com.demo.hibernate.one2many.Employee"
    maxElementsInMemory="10"
    eternal="false"
    timeToIdleSeconds="300"
    timeToLiveSeconds="600"
    overflowToDisk="true"/>

复制代码

3.4 测试
复制代码

public class HibernateQBCTest {
    
    private SessionFactory sf;
    
    @Before
    public void getSessionFactory(){
    sf = OracleSessionUtils.getSessionFactory();
}

//查询所有
@Test
public void list(){
     Session session = sf.openSession();
     Transaction tx = session.beginTransaction();
     List<Employee> empList = session.createCriteria(Employee.class).list();
     for(Employee e : empList){
         System.out.println(e.getEname());
     }
     tx.commit();
     session.close();
     
     //以下查询不会发送SQL
     Session session1 = sf.openSession();
     Transaction tx1 = session1.beginTransaction();
     Employee e = session1.get(Employee.class, 7369);
     System.out.println(e.getEname());  
     tx1.commit();
     session1.close();
}
}

喜欢这篇文章的可以点个赞,欢迎大家留言评论,记得关注我,每天持续更新技术干货、职场趣事、海量面试资料等等
如果你对java技术很感兴趣也可以加入我的java学习群 V–(ddmsiqi)来交流学习,里面都是同行,验证【CSDN2】有资源共享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值