1. 程式人生 > >hibernate中的二級緩存

hibernate中的二級緩存

get art app 使用 .class 程序 rop 不能 table

二級緩存使用場景:不經常修改的數據,但是經常的訪問的數據會放到緩存中去

一級緩存僅僅是session內部的緩存,用來存取sql語句,比如說連續調用兩次相同參數的get方法,就是session緩存

二級緩存是sessiionFactory層面的緩存,即不同線程,不同程序之間的緩存

技術分享

1.在hibernate.hbm.xml中加載配置

<property name="cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>

<!-- 配置緩存項 可以在hibernate.hbm.xml下配置 也可以在各自類下的映射文件下配 -->
<class-cache usage="read-write" class="cache.Employee"/>
<class-cache usage="read-write" class="cache.Department"/>

類緩存

public void testCahce()
{
Session session=sessionFactory.openSession();

Transaction tx=session.beginTransaction();
Employee employee=(Employee) session.get(Employee.class, 1);
// System.out.println(employee);

Session session2=sessionFactory.openSession();
Employee employee1=(Employee) session.get(Employee.class,1);

//sessionFactory 二級緩存 當兩個session用get查詢相同的數據就會調用使用


tx.commit();
session.close();
}

2.集合緩存

<collection-cache usage="read-write" collection="cache.Department.employees"/>

/**
* 二級緩存中的集合緩存
*/
@Test
public void testCahce2()
{
Session session=sessionFactory.openSession();

Transaction tx=session.beginTransaction();
Department department=(Department) session.get(Department.class, 1);
System.out.println(department.getEmployees());//懶加載
// System.out.println(employee);
Session session2=sessionFactory.openSession();
department=(Department) session2.get(Department.class, 1);
System.out.println(department.getEmployees()); //由於集合為設置二級緩存 所以相同數據也會加載兩次
//sessionFactory 二級緩存 當兩個session用get查詢相同的數據就會調用使用

tx.commit();
session.close();

不是用集合緩存


}技術分享

使用集合緩存

技術分享

3.查詢語句緩存(只針對相同sql語句的緩存)

(1)iterator實現

/**
* 查詢緩存 n+1次查詢 按一模一樣的查詢語句來緩存
*/
@Test
public void testQueryCache()
{
Session session=sessionFactory.openSession();

Transaction tx=session.beginTransaction();
Iterator<Employee> iterator=session.createQuery("from Employee where id<5").iterate();
while(iterator.hasNext())
{
System.out.println(iterator.next());
}

Iterator<Employee> iterator1=session.createQuery("from Employee where id<5").iterate();
while(iterator1.hasNext())
{
System.out.println(iterator1.next());
}
tx.commit();
session.close();
}

(2)使用setCacheable實現

需加載額外配置

<property name="cache.use_query_cache">true</property>

@Test
public void testQueryCachetrue()
{
Session session=sessionFactory.openSession();

Transaction tx=session.beginTransaction();
List list=session.createQuery("from Employee where id<5").setCacheable(true).list();
System.out.println(list);
tx.commit();
session.close();
Session session1=sessionFactory.openSession();
Transaction tx1=session1.beginTransaction();
List list1=session1.createQuery("from Employee where id<5").setCacheable(true).list();
System.out.println(list1);
tx1.commit();
session1.close();

}

技術分享

但是sql語句有一點不一樣 ,都不能使用緩存

技術分享

技術分享

hibernate中的二級緩存