本文主要摘自Hibernate緩存俗扇,整理些要點出來
Hibernate查詢緩存依賴于二級緩存止潘。當啟用查詢緩存后瓦宜,第一次執(zhí)行查詢語句時筐喳,Hibernate會把查詢結(jié)果保存在二級緩存中姑原。當再次執(zhí)行查詢語句時悬而,只需從緩存中獲取查詢結(jié)果即可。
查詢緩存適用于以下場合:
- 經(jīng)常使用查詢語句
- 很少對查詢語句關(guān)聯(lián)的數(shù)據(jù)庫數(shù)據(jù)進行插入页衙,刪除和更新操作
查詢緩存的配置
- 配置二級緩存
- 在hibernate中配置
<prop key="hibernate.cache.user_query_cache">true</prop>
- 調(diào)用
Query
,Criteria
接口的setCacheable()
方法
@Cache
@Cache
定義了二級緩存策略和緩存范圍
@Cache(
CacheConcurrencyStrategy usage(); //1
String region() default ""; //2
String include() default "all"; //3
-
usage
: 當前緩存策略(NONE, READ_ONLY, NONSTRICT_READ_WRITE, TRANSACTIONAL)摊滔。
-
read-only
: 只讀緩存如果你的應用程序只需讀取一個持久化類的實例,而無需對其修改店乐, 那么就可以對其進行只讀緩存
-
read-write
: 讀寫緩存
如果應用程序需要更新數(shù)據(jù)艰躺,那么使用讀/寫緩存比較合適。 如果應用程序要求“序列化事務”的隔離級別(serializable transaction isolation level)眨八,那么就決不能使用這種緩存策略
-
nonstrict-read-write
: 不嚴格讀寫緩存
如果應用程序只偶爾需要更新數(shù)據(jù)(也就是說腺兴,兩個事務同時更新同一記錄的情況很不常見),也不需要十分嚴格的事務隔離廉侧,那么比較適合使用非嚴格讀/寫緩存策略页响。
-
transactional
:事務性緩存
Hibernate 的事務緩存策略提供了全事務的緩存支持,例如對 JBoss TreeCache 的支持段誊。這樣的緩存只能用于 JTA 環(huán)境中闰蚕,你必須指定為其 hibernate.transaction.manager_lookup_class屬性。
-
region
: 可選參數(shù)连舍,指定二級緩存的去域名没陡,默認為類或者集合的名字. -
include
: 可選參數(shù)(all
,non-lazy
)。all
包含所有屬性索赏,non-lazy
僅包含非延遲加載的屬性
緩存實體
@javax.persistence.Entity
@Table(name = "PROVICE")
@Cache(usage =CacheConcurrencyStrategy.READ_ONLY)
public class Province() {
...
}
緩存集合
@javax.persistence.Entity
@Table(name = "PROVICE")
@Cache(usage =CacheConcurrencyStrategy.READ_ONLY)
public class Province() {//省份對象
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "cityId")
@Cache(usage = CacheConcrrencyStrategy.READ_ONLY)
private Set<City> cities; //省份對應城市
}
此時在訪問province.cities
時盼玄,Hibernate 只緩存了city的OID,因此在實際查詢過程中還是需要執(zhí)行
select * from city where cityid = ?
為了避免該問題潜腻,可以為City
對象同樣配置二級緩存
@javax.persistence.Entity
@Table(name = "CITY")
@Cache(usage =CacheConcurrencyStrategy.READ_ONLY)
public class City() {//城市對象
...
}