Hbernateキャッシュポリシーのクエリキャッシュ


クエリーキャッシュ:
まずキャッシュの内容を確認します。キャッシュのkeyはHQL文とパラメータ、キャッシュのvalueは以下の通りです。
1、  クエリーが通常の結果セットである場合、これらの結果セットはキャッシュされます。
2、  クエリーがエンティティオブジェクトである場合、キャッシュされているのはエンティティオブジェクトのIDリストである。
3、  クエリキャッシュはSession Factoryレベルのキャッシュであり、session Factoryによって管理されています。
 
今からキャッシュを使う3つのステップを見てみます。
1、  Hybernateプロファイルでクエリーキャッシュを有効にします。
   
<property name=「hibernate.ache.usequeryucache」true
2、  クエリーキャッシュを提供するポリシープロバイダーは、一般的には、二次キャッシュのプロバイダーと同じである。
   
    org.hibernate.cache.Hashtable Cacheco Provider
3、  クエリの前にQuery.set Cachebale(true)を呼び出してキャッシュを調べます。例を挙げると次のようになります。
session.beginTransaction();
			//     SessionFactory     
			String hql = "select p.id,p.name from Person p";
			List persons = session.createQuery(hql)
				.setCacheable(true) //      !
				.list();
			for (Iterator iterator = persons.iterator(); iterator.hasNext();) {
				Object[] datas = (Object[]) iterator.next();
				System.out.println(datas[0]+","+datas[1]);
			}			
			session.getTransaction().commit();
		}catch(Exception e){
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally{
			//session    ,  session             
			session.close();
		}		
		Session session2 = HibernateUtil.openSession();
		try{			
			session2.beginTransaction();
			String hql = "select p.id,p.name from Person p";
			//   sql  
List persons = session2.createQuery(hql)
				.setCacheable(true) //      !
				.list();
			for (Iterator iterator = persons.iterator(); iterator.hasNext();) {
				Object[] datas = (Object[]) iterator.next();
				System.out.println(datas[0]+","+datas[1]);
			}			
			session2.getTransaction().commit();
 続いて研究を続けます。もし照会のパラメータが一致しないならば?
session.beginTransaction();
			//         ,          
			String hql = "select p.id,p.name from ContactPerson p where p.name like ?";
			List persons = session.createQuery(hql)
				.setParameter(0, "% %")
				.setCacheable(true) //      !
				.list(); 
 session2.beginTransaction();
			String hql = "select p.id,p.name from ContactPerson p where p.name like ?";
			List persons = session2.createQuery(hql)
				.setParameter(0, "% %")
				.setCacheable(true) //      !
				.list();
 
上では二つのsql文を送ります。照会のパラメータが一致しないからです。
キャッシュの1+Nの問題を調べて1+Nの問題の文章に会います!
まとめ:
    - 注意したいのですが、キャッシュは一般的に二級キャッシュと一緒に使います。
    - クエリー条件とパラメータが非常に変わりやすい場合は、クエリーキャッシュをご利用ください。
    - クエリキャッシュのN個のクエリの問題を理解してください。