??? 如果不設置“查詢緩存”,那么hibernate只會緩存使用load()方法獲得的單個持久化對象,如果想緩存使用findall()、 list()、Iterator()、createCriteria()、createQuery()等方法獲得的數據結果集的話,就需要設置hibernate.cache.use_query_cache true 才行2.首先設置EhCache,建立配置文件ehcache.xml,默認的位置在class-path,可以放到你的src目錄下:
以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中,所以查詢緩存通常會和二級緩存一起使用。
Powered by: BlogJava Copyright © 我是菜鳥