hibernate的二级缓存配置三种,类缓存、集合缓存、查询缓存。
Hibernate的缓存机制 主要是根据OID的形式查询的
一、类缓存
public class App {
private static SessionFactory sessionFactory = new Configuration()//
.configure()//
.addClass(Department.class)// 添加Hibernate实体类(加载对应的映射文件)
.addClass(Employee.class)// 添加Hibernate实体类(加载对应的映射文件)
.buildSessionFactory();
// 测试一级缓存(Session缓存)
@Test
public void testSessionCache() throws Exception {
// ===================== 第1个Session
Session session = sessionFactory.openSession();
session.beginTransaction();
Employee employee = (Employee) session.get(Employee.class,1); // 获取
System.out.println(employee);
session.getTransaction().commit();
session.close();
// ===================== 第2个Session
Session session2 = sessionFactory.openSession();
session2.beginTransaction();
//根据oID查找
Employee employee2 = (Employee) session2.get(Employee.class,1); // 获取
System.out.println(employee2);
session2.getTransaction().commit();
session2.close();
}
// 测试二级缓存
@Test
public void testSecondCache() throws Exception {
// ===================== 第1个Session
Session session = sessionFactory.openSession();
session.beginTransaction();
Department department = (Department) session.get(Department.class, 1); // 获取
System.out.println(department.getName());
System.out.println(department.getEmployees());
session.getTransaction().commit();
session.close();
// ===================== 第2个Session
Session session2 = sessionFactory.openSession();
session2.beginTransaction();
Department department2 = (Department) session2.get(Department.class, 1); // 获取
System.out.println(department2.getName());
System.out.println(department2.getEmployees());
session2.getTransaction().commit();
session2.close();
}
类缓存的配置:
类缓存的配置可以在实体映射中配置 也可以在hibernate.cfg.xml中配置
在hibernate.cfg.xml中配置如下:
步骤1:
设置类缓存,使用二级缓存
<property name="cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
步骤二、
指定要使用二级缓存的类
<class-cache usage="read-only" class="包名.类名" />
集合缓存:
<collection-cache usage="read-only" collection="包名.类名.你类中的set 的命名" />
查询缓存:
<property name="cache.use_query_cache">true</property>
public void testQueryCache3() throws Exception {
// ===================== 第1个Session
Session session = sessionFactory.openSession();
session.beginTransaction();
List list = session.createQuery("FROM Employee e WHERE e.id<18")//
.setCacheable(true)// 是否使用查询缓存,需要在hibernate.cfg.xml中开启查询缓存才行
.list();
System.out.println(list);
session.getTransaction().commit();
session.close();
System.out.println("\n------------------\n");
// ===================== 第2个Session
Session session2 = sessionFactory.openSession();
session2.beginTransaction();
List list2 = session2.createQuery("FROM Employee e WHERE e.id<18")//
.setCacheable(true)// 是否使用查询缓存
.list();
System.out.println(list2);
session2.getTransaction().commit();
session2.close();
}
文章只是自己做的笔记,若有朋友参考学习请百度其他网友的。