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)を呼び出してキャッシュを調べます。例を挙げると次のようになります。
上では二つのsql文を送ります。照会のパラメータが一致しないからです。
キャッシュの1+Nの問題を調べて1+Nの問題の文章に会います!
まとめ:
- 注意したいのですが、キャッシュは一般的に二級キャッシュと一緒に使います。
- クエリー条件とパラメータが非常に変わりやすい場合は、クエリーキャッシュをご利用ください。
- クエリキャッシュのN個のクエリの問題を理解してください。
まずキャッシュの内容を確認します。キャッシュのkeyはHQL文とパラメータ、キャッシュのvalueは以下の通りです。
1、 クエリーが通常の結果セットである場合、これらの結果セットはキャッシュされます。
2、 クエリーがエンティティオブジェクトである場合、キャッシュされているのはエンティティオブジェクトのIDリストである。
3、 クエリキャッシュはSession Factoryレベルのキャッシュであり、session Factoryによって管理されています。
今からキャッシュを使う3つのステップを見てみます。
1、 Hybernateプロファイルでクエリーキャッシュを有効にします。
<property name=「hibernate.ache.usequeryucache」true
2、 クエリーキャッシュを提供するポリシープロバイダーは、一般的には、二次キャッシュのプロバイダーと同じである。
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個のクエリの問題を理解してください。