📜  休眠二级缓存

📅  最后修改于: 2021-01-02 15:54:23             🧑  作者: Mango

休眠二级缓存

Hibernate二级缓存对会话工厂的所有会话对象使用通用缓存。如果您有一个会话工厂中的多个会话对象,这将很有用。

SessionFactory保存第二级缓存数据。它对于所有会话对象都是全局的,默认情况下未启用。

不同的供应商提供了二级缓存的实现。

  • EH快取
  • 操作系统缓存
  • 群缓存
  • JBoss缓存

每个实现提供不同的缓存使用功能。有两种使用二级缓存的方法。

  • 只读:缓存将适用于只读操作。
  • nonstrict-read-write:缓存适用于读写,但一次只能缓存一次。
  • 读写:缓存适用于读写,可以同时使用。
  • 事务性的:缓存将适用于事务。

可以将cache-usage属性应用于hbm.xml文件中的类或集合级别。下面给出了定义缓存使用情况的示例:

          

让我们看看第二级缓存的实现和缓存使用情况。

Implementation read-only nonstrict-read-write read-write transactional
EH Cache Yes Yes Yes No
OS Cache Yes Yes Yes No
Swarm Cache Yes Yes No No
JBoss Cache No No No Yes

休眠二级缓存示例

要通过示例了解二级缓存,我们需要执行以下步骤:

  • 使用Maven创建持久类
  • 在pom.xml文件中添加项目信息和配置
  • 创建配置文件
  • 创建检索持久对象的类。

在这里,我们假设oracle数据库中有emp1012表,其中包含一些记录。

1)使用Maven创建持久类。

package com.javatpoint;  
import javax.persistence.*;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@Table(name="emp1012")
@Cacheable
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
public class Employee {  
    @Id
private int id;  
private String name;  
private float salary;  
  
public Employee() {}  
public Employee(String name, float salary) {  
    super();  
    this.name = name;  
    this.salary = salary;  
}
public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public float getSalary() {
    return salary;
}
public void setSalary(float salary) {
    this.salary = salary;
}  
}  

2)在pom.xml文件中添加项目信息和配置。

打开pom.xml文件,然后单击源。现在,在 …. 标记之间添加以下依赖关系。

  
    org.hibernate
    hibernate-core
    5.2.16.Final

    

    com.oracle
    ojdbc14
    10.2.0.4.0

    

    net.sf.ehcache
    ehcache
    2.10.3

    
   

    org.hibernate
    hibernate-ehcache
    5.2.16.Final


3)创建配置文件

  
  
  
  
  
      
        true  
        update  
        org.hibernate.dialect.Oracle9Dialect  
        jdbc:oracle:thin:@localhost:1521:xe  
        system  
        jtp  
        oracle.jdbc.driver.OracleDriver  
       
         true 
         org.hibernate.cache.ehcache.EhCacheRegionFactory
         
      
  

要实现二级缓存,我们需要在配置文件中定义cache.provider_class属性。

4)创建检索持久对象的类。

package com.javatpoint;  
  
import org.hibernate.Session;  
import org.hibernate.SessionFactory;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
  
public class FetchTest {  
public static void main(String[] args) {  
    StandardServiceRegistry ssr=new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();
    Metadata meta=new MetadataSources(ssr).getMetadataBuilder().build();
    
    SessionFactory factory=meta.getSessionFactoryBuilder().build();
      
    Session session1=factory.openSession();  
    Employee emp1=(Employee)session1.load(Employee.class,121);  
    System.out.println(emp1.getId()+" "+emp1.getName()+" "+emp1.getSalary());  
    session1.close();  
      
    Session session2=factory.openSession();  
    Employee emp2=(Employee)session2.load(Employee.class,121);  
    System.out.println(emp2.getId()+" "+emp2.getName()+" "+emp2.getSalary());  
    session2.close();  
      
}  
}  

输出:

正如我们在这里看到的,休眠不会触发两次查询。如果您不使用二级缓存,则由于两个查询使用不同的会话对象,因此休眠将触发两次查询。