📅  最后修改于: 2021-01-02 15:54:23             🧑  作者: Mango
Hibernate二级缓存对会话工厂的所有会话对象使用通用缓存。如果您有一个会话工厂中的多个会话对象,这将很有用。
SessionFactory保存第二级缓存数据。它对于所有会话对象都是全局的,默认情况下未启用。
不同的供应商提供了二级缓存的实现。
每个实现提供不同的缓存使用功能。有两种使用二级缓存的方法。
可以将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 |
要通过示例了解二级缓存,我们需要执行以下步骤:
在这里,我们假设oracle数据库中有emp1012表,其中包含一些记录。
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;
}
}
打开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
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属性。
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();
}
}
正如我们在这里看到的,休眠不会触发两次查询。如果您不使用二级缓存,则由于两个查询使用不同的会话对象,因此休眠将触发两次查询。