????

































??? 如果不設置“查詢緩存”,那么hibernate只會緩存使用load()方法獲得的單個持久化對象,如果想緩存使用findall()、 list()、Iterator()、createCriteria()、createQuery()等方法獲得的數據結果集的話,就需要設置hibernate.cache.use_query_cache true 才行
2.首先設置EhCache,建立配置文件ehcache.xml,默認的位置在class-path,可以放到你的src目錄下:





































???????????????????????????????????????????????????????????? Machine.


















??????? "600" ?? timeToLiveSeconds="600"?overflowToDisk="false"?diskPersistent="false"/>











以com.ouou.model.Videos為例子
在Videos.hbm.xml中配置:
<class name="Videos" table="TEST" lazy="false">
? <cache usage="read-write" region="ehcache.xml中的name的屬性值"/>注意:這一句需要緊跟在class標簽下面,其他位置無效。
hbm文件查找cache方法名的策略:如果不指定hbm文件中的region="ehcache.xml中的name的屬性值",則使用name名為com.ouou.model.Videos的cache,
如果不存在與類名匹配的cache名稱,則用defaultCache。
如果Videos包含set集合,則需要另行指定其cache
例如Videos包含Tags集合,則需要
添加如下配置到ehcache.xml中
<cache name="com.ouou.model.Tags"
??????? maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120"
??????? timeToLiveSeconds="120" overflowToDisk="false" />
另,針對查詢緩存的配置如下:
<cache name="org.hibernate.cache.UpdateTimestampsCache"
??????? maxElementsInMemory="5000"
??????? eternal="true"
??????? overflowToDisk="true"/>
<cache name="org.hibernate.cache.StandardQueryCache"
??????? maxElementsInMemory="10000"
??????? eternal="false"
??????? timeToLiveSeconds="120"
??????? overflowToDisk="true"/>
3、 選擇緩存策略依據:
<cache? usage="transactional|read-write|nonstrict-read-write|read-only" (1)/>
ehcache不支持transactional,其他三種可以支持。
read-only:無需修改, 那么就可以對其進行只讀 緩存,注意,在此策略下,如果直接修改數據庫,即使能夠看到前臺顯示效果,
但是將對象修改至cache中會報error,cache不會發生作用。另:刪除記錄會報錯,因為不能在read-only模式的對象從cache中刪除。
read-write:需要更新數據,那么使用讀/寫緩存 比較合適,前提:數據庫不可以為serializable transaction isolation level
(序列化事務隔離級別)
nonstrict-read-write:只偶爾需要更新數據(也就是說,兩個事務同時更新同一記錄的情況很不常見),也不需要十分嚴格的事務隔離,
那么比較適合使用非嚴格讀/寫緩存策略。
4、 調試時候使用log4j的log4j.logger.org.hibernate.cache=debug,更方便看到ehcache的操作過程,主要用于調試過程,實際應用發布時候,請注釋掉,以免影響性能。
5、 使用ehcache,打印sql語句是正常的,因為query cache設置為true將會創建兩個緩存區域:一個用于保存查詢結果集 (
org.hibernate.cache.StandardQueryCache);另一個則用于保存最近查詢的一系列表的時間戳(org.hibernate.cache.UpdateTimestampsCache)。
請注意:在查詢緩存中,它并不緩存結果集中所包含的實體的確切狀態;它只緩存這些實體的標識符屬性的值、以及各值類型的結果。
需要將打印sql語句與最近的cache內容相比較,將不同之處修改到cache中,所以查詢緩存通常會和二級緩存一起使用。