hibernate中的二級緩衝

來源:互聯網
上載者:User

標籤:log   不能   width   參數   情境   hash   就會   一模一樣   映射   

二級緩衝使用情境:不經常修改的資料,但是經常的訪問的資料會放到緩衝中去

一級緩衝僅僅是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中的二級緩衝

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.