Hibernate 2級キャッシュ例(4.2 Final版)


もっと読む
Hbernate 4.2中のキャッシュ
1、hibernateの中のキャッシュは一級キャッシュと二級キャッシュとクエリーキャッシュに分けられます。
  • 一級キャッシュ:セッションレベルのキャッシュ
  • 級キャッシュ:Session Factoryレベルのキャッシュ
  • クエリーキャッシュ
  • 2、一級キャッシュ
    @Test
    public void testCache() {
    	Session s = sf.getCurrentSession();
    	s.beginTransaction();
    	Category c = (Category)s.load(Category.class, 1);
    	System.out.println(c.getName());
    	
    	Category c1 = (Category)s.load(Category.class, 1);
    	System.out.println(c1.getName());
    	
    	s.getTransaction().commit();
    	
    	Session s2 = sf.getCurrentSession();
    	s2.beginTransaction();
    	Category c2 = (Category)s2.load(Category.class, 1);
    	System.out.println(c2.getName());
    	s2.getTransaction().commit();
    }
    二級キャッシュを使用しない場合、一つのSessionで一つのオブジェクトをロードして二回だけ調べます。一つのSessionで一つのオブジェクトをロードしたら、一回だけ調べます。違うSessionで各Loadに一回ずつ登録すれば、二回のクエリーが行われます。つまり、第二のセッションは最初のセッションのバッファにアクセスできません。
    3、二級キャッシュ(Hibernateでは二級キャッシュを使用)
    (一)対応するJarパッケージを導入する
  • ehcache-core-
  • ヒベルナツ-ehcache-42.2.0.Final.jar
  • sf 4 j-appi-1.6.1.jar
  • (二)キャッシュ設定を開き、EhCacheを例に実験を行う
    true  
    org.hibernate.cache.ehcache.EhCacheRegionFactory
    (三)キャッシュ対象を設定し、Category類に注釈@Cacheを加える
    @Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
    public class Category {
    (四)二級キャッシュをテストします。この時は二つの異なるSessionの中でLoadを行っても一回しか確認できません。
    @Test
    public void testCache2() {
    	Session s = sf.getCurrentSession();
    	s.beginTransaction();
    	Category c = (Category)s.load(Category.class, 1);
    	System.out.println(c.getName());
    	s.getTransaction().commit();
    	
    	Session s2 = sf.getCurrentSession();
    	s2.beginTransaction();
    	Category c2 = (Category)s2.load(Category.class, 1);
    	System.out.println(c2.getName());
    	s2.getTransaction().commit();
    }
    
    
    4、クエリーキャッシュ
  • は、クエリーキャッシュを設定し、クエリーキャッシュは、二級キャッシュをベースにして
  • である。
    true
  • クエリテスト(setCachable(true)方法を使用しなければならない)
  • @Test
    public void testQueryCache() {
    	Session s = sf.getCurrentSession();
    	s.beginTransaction();
    	List cs = (List)s.createQuery("from Category").setCacheable(true).list();
    	for(Category c : cs) {
    		System.out.println(c.getName());
    	}
    	
    	List cs2 = (List)s.createQuery("from Category").setCacheable(true).list();
    	for(Category c : cs2) {
    		System.out.println(c.getName());
    	}
    	s.getTransaction().commit();
    	
    	Session s2 = sf.getCurrentSession();
    	s2.beginTransaction();
    	List cs3 = (List)s2.createQuery("from Category").setCacheable(true).list();
    	for(Category c : cs3) {
    		System.out.println(c.getName());
    	}
    	s2.getTransaction().commit();
    }