生活随笔
收集整理的這篇文章主要介紹了
JPA环境下使用Hibernate二级缓存
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://tuhaitao.iteye.com/blog/568653
hibernate二級緩存本質上分為兩類:
1.對象緩存
2.查詢緩存
在JPA環境下,例如Jboss,底層還是通過Hibernate來實現JPA的Query。
下邊簡單說一下配置的步驟:
1.配置entity
在實體上方加入@Cache
Java代碼 ?
import?java.io.Serializable;????import?javax.persistence.Entity;??import?javax.persistence.GeneratedValue;??import?javax.persistence.Id;??import?javax.persistence.Table;????import?org.hibernate.annotations.Cache;??import?org.hibernate.annotations.CacheConcurrencyStrategy;????@Entity??@Table??@Cache(usage?=?CacheConcurrencyStrategy.READ_WRITE)??public?class?User?implements?Serializable?{??????private?static?final?long?serialVersionUID?=?-5121812640999313420L;????????private?Integer?id;????????????private?String?name;????????@Id??????@GeneratedValue??????public?Integer?getId()?{??????????return?id;??????}????????public?void?setId(Integer?id)?{??????????this.id?=?id;??????}????????public?String?getName()?{??????????return?name;??????}????????public?void?setName(String?name)?{??????????this.name?=?name;??????}????????}??
CacheConcurrencyStrategy有幾種,大家自己查下相關資料,按需要配置就可以了,我這里不需要事務支持.
需要注意的是,@Cache這個注解在很多jar包里都有,注意我上邊寫的import.
2.配置EJB/META-INF/persistence.xml
Xml代碼 ?
<?xml?version="1.0"?encoding="UTF-8"?>????????<persistence?xmlns="http://java.sun.com/xml/ns/persistence"??????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??????xsi:schemaLocation="http://java.sun.com/xml/ns/persistence?http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"??????version="1.0">????????<persistence-unit?name="cachedb">??????????<jta-data-source>java:/cachedb</jta-data-source>??????????<properties>??????????????<property?name="hibernate.hbm2ddl.auto"?value="update"?/>??????????????<property?name="hibernate.show_sql"?value="true"?/>??????????????<property?name="hibernate.format_sql"?value="true"?/>??????????????<property?name="hibernate.cache.use_second_level_cache"?value="true"?/>??????????????<property?name="hibernate.cache.use_structured_entries"?value?="true"?/>??????????????<property?name="hibernate.cache.use_query_cache"?value="true"?/>??????????????<property?name="hibernate.cache.provider_class"?value="com.googlecode.hibernate.memcached.MemcachedCacheProvider"?/>??????????????<property?name="hibernate.memcached.servers"?value="localhost:11211"?/>??????????????<property?name="hibernate.memcached.cacheTimeSeconds"?value="300"?/>??????????</properties>??????</persistence-unit>????</persistence>??
這里我使用了memcached,還有Ehcache、OSchache、或者TreeCache等,主要需配置:
hibernate.cache.use_second_level_cache = true
hibernate.cache.use_query_cache = true
與相應的hibernate.cache.provider_class
3.在程序中使用查詢緩存
??? 首先大家需要明確JPA對緩存的規范還沒有形成,但JPA實現的廠家都會用hibernate來做JPA的實現,所以通常的方法是將JPA的Query轉換成Hibernate的Query,大家用過Hibernate都知道,Hibernate里的Query有個setCacheable(true/false)的方法,這里是設置查詢是否進入二級緩存的.
??? 這里需要強調一下,默認的如果不在程序中顯示的執行查詢緩存聲明操作,hibernate是不會對查詢的list進行緩存的,默認的在開啟hibernate二級緩存時,hibernate只緩存,根據主鍵id查找的對象,jpa下是find(id, clazz)方法.
下邊是轉換的代碼:為了區分JPA的Query與Hibernate的Query,我寫上了全名
Java代碼 ?
public?List<User>?listUser()?{??javax.persistence.Query?query?=?em.createQuery("from?User?u?where?u.id>:id",?User.class);??query.setParameter("id",?5);??org.hibernate.ejb.QueryImpl?hs?=?null;??org.hibernate.Query?hbQuery?=?null;??List<User>?list?=?null;??if(query?instanceof?org.hibernate.ejb.QueryImpl)?{??????hs?=?(org.hibernate.ejb.QueryImpl)query;??????hbQuery?=?hs.getHibernateQuery();??????hbQuery.setCacheable(true);??????list?=?hbQuery.list();??}?else?{??????list?=?query.getResultList();??}??return?list;??}??
這里再說一下使用經驗,這樣的轉換不光是對createQuery方法,還能對createNamedQuery,甚至是createNativeQuery,都可以緩存查詢結果.
只是一點使用經驗,跟大家分享一下:)
總結
以上是生活随笔為你收集整理的JPA环境下使用Hibernate二级缓存的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。