posts - 297,  comments - 1618,  trackbacks - 0
          原文出處:http://i.cn.yahoo.com/en.wan1982/blog/p_9/

          1. 在Hibernate配置文件中設(shè)置:
              

          <!-- Hibernate SessionFactory -->
              
          <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
                  
          <property name="dataSource" ref="dataSource"/>
                  
          <property name="mappingResources">
                  
          <list>
                      
          <value>com/ouou/model/Videos.hbm.xml</value>   
                   
          </list>
                   
          </property>
                  
          <property name="hibernateProperties">
                      
          <props>
                          
          <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                          
          <prop key="hibernate.current_session_context_class">thread</prop>
                          
          <prop key="hibernate.cglib.use_reflection_optimizer">false</prop>
                          
          <prop key="hibernate.query.substitutions">true 'Y'false 'N'</prop>
                          
          <!--add ehcache-->
                          
          <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
                          
          <prop key="hibernate.cache.use_query_cache">false</prop><!-- 是否使用查詢緩存 -->
                          
          <!--
                          
          <prop key="hibernate.cache.provider_configuration_file_resource_path">/ehcache.xml</prop>
                          
          <prop key="hibernate.show_sql">true</prop>
                          
          -->
                          
          <!--<prop key="hibernate.transaction.auto_close_session">true</prop>-->
                          
          <prop key="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
                          
          <!-- Create/update the database tables automatically when the JVM starts up
                           
          <prop key="hibernate.hbm2ddl.auto">update</prop> -->
                          
          <!-- Turn batching off for better error messages under PostgreSQL -->
                          
          <prop key="hibernate.jdbc.batch_size">25</prop>
                          
          <!--
                          
          <prop key="hibernate.connection.pool_size">10</prop>
                          
          -->
                      
          </props>
                  
          </property>
              
          </bean>


              如果不設(shè)置“查詢緩存”,那么hibernate只會(huì)緩存使用load()方法獲得的單個(gè)持久化對(duì)象,如果想緩存使用findall()、 list()、Iterator()、createCriteria()、createQuery()等方法獲得的數(shù)據(jù)結(jié)果集的話,就需要設(shè)置hibernate.cache.use_query_cache true 才行

          2.首先設(shè)置EhCache,建立配置文件ehcache.xml,默認(rèn)的位置在class-path,可以放到你的src目錄下:

           <ehcache>

              
          <!-- Sets the path to the directory where cache .data files are created.

               If the path is a Java System Property it is replaced by
               its value in the running VM.
               The following properties are translated:
               user.home 
          - User's home directory
               user.dir - User's current working directory
               java.io.tmpdir - Default temp file path -->
               
          <!--<diskStore path="java.io.tmpdir"/>-->
               
          <diskStore path="/data/ehcache"/>

              
          <!--Default Cache configuration. These will applied to caches programmatically created through
                  the CacheManager.

                  The following attributes are required:

                  maxElementsInMemory            
          - Sets the maximum number of objects that will be created in memory
                  eternal                                     
          - Sets whether elements are eternal. If eternal,  timeouts are 
                                                                      ignored and the element is never expired.
                  overflowToDisk                      
          - Sets whether elements can overflow to disk when the in-memory cache
                                                                  has reached the maxInMemory limit.

                  The following attributes are optional:
                  timeToIdleSeconds           
          - Sets the time to idle for an element before it expires.
                                                                  i.e. The maximum amount of time between accesses before an
                                                                  element expires Is only used 
          if the element is not eternal.
                                                                  Optional attribute. A value of 
          0 means that an Element can idle
                                                                 
          for infinity.The default value is 0.
                  timeToLiveSeconds             
          - Sets the time to live for an element before it expires.
                                                                   i.e. The maximum time between creation time and when an element 
                                                                   expires.  Is only used 
          if the element is not eternal.
                                                                   Optional attribute. A value of 
          0 means that and Element can live
                                                                  
          for infinity.
                                                                  The 
          default value is 0.
                  diskPersistent                           
          - Whether the disk store persists between restarts of the Virtual
                                                                       Machine.
                                                                   The 
          default value is false.
                  diskExpiryThreadIntervalSeconds   
          - The number of seconds between runs of the disk expiry thread. 
                                                                   The 
          default value  is 120 seconds.
                  
          -->

              
          <defaultCache
                  maxElementsInMemory
          ="10000"
                  eternal
          ="false"
                  overflowToDisk
          ="true"
                  timeToIdleSeconds
          ="120"
                  timeToLiveSeconds
          ="120"
                  diskPersistent
          ="false"
                  diskExpiryThreadIntervalSeconds
          ="120"/>
              
          <cache name="org.hibernate.cache.UpdateTimestampsCache" maxElementsInMemory="5000" 
               eternal
          ="true" overflowToDisk="true"/>
              
          <cache name="org.hibernate.cache.StandardQueryCache" maxElementsInMemory="5" eternal="false"
              timeToLiveSeconds
          ="120" overflowToDisk="true"/>
              
          <cache name="userCache" maxElementsInMemory="100000" eternal="false" timeToIdleSeconds=
                  "
          600"    timeToLiveSeconds="600" overflowToDisk="false" diskPersistent="false"/>
              
          <cache name="com.ouou.webapp.util.OuouMethodIntecepter" maxElementsInMemory="100000" 
              eternal
          ="false" timeToIdleSeconds="600" timeToLiveSeconds="600" overflowToDisk="false"
              diskPersistent
          ="false"/>
              
          <cache name="bbcode" maxElementsInMemory="100000" eternal="false" timeToIdleSeconds="600"
              timeToLiveSeconds
          ="600" 
              overflowToDisk
          ="false" diskPersistent="false"/>
              
          <cache name="com.ouou.model.Videos" maxElementsInMemory="10000"  eternal="false" 
              overflowToDisk
          ="false" timeToIdleSeconds="120" timeToLiveSeconds="120" diskPersistent="false"/>
              
          <cache name="com.ouou.model.Tags" maxElementsInMemory="10000"  eternal="false"
              overflowToDisk
          ="false" timeToIdleSeconds="120" timeToLiveSeconds="120" diskPersistent="false"/>
          </ehcache>


          以com.ouou.model.Videos為例子
          在Videos.hbm.xml中配置:
          <class name="Videos" table="TEST" lazy="false">
            <cache usage="read-write" region="ehcache.xml中的name的屬性值"/>注意:這一句需要緊跟在class標(biāo)簽下面,其他位置無效。
          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" />
          另,針對(duì)查詢緩存的配置如下:
          <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、 選擇緩存策略依據(jù):

          <cache  usage="transactional|read-write|nonstrict-read-write|read-only" (1)/>
          ehcache不支持transactional,其他三種可以支持。
          read-only:無需修改, 那么就可以對(duì)其進(jìn)行只讀 緩存,注意,在此策略下,如果直接修改數(shù)據(jù)庫(kù),即使能夠看到前臺(tái)顯示效果,
          但是將對(duì)象修改至cache中會(huì)報(bào)error,cache不會(huì)發(fā)生作用。另:刪除記錄會(huì)報(bào)錯(cuò),因?yàn)椴荒茉趓ead-only模式的對(duì)象從cache中刪除。
          read-write:需要更新數(shù)據(jù),那么使用讀/寫緩存 比較合適,前提:數(shù)據(jù)庫(kù)不可以為serializable transaction isolation level
          (序列化事務(wù)隔離級(jí)別)
          nonstrict-read-write:只偶爾需要更新數(shù)據(jù)(也就是說,兩個(gè)事務(wù)同時(shí)更新同一記錄的情況很不常見),也不需要十分嚴(yán)格的事務(wù)隔離,
          那么比較適合使用非嚴(yán)格讀/寫緩存策略。

          4、 調(diào)試時(shí)候使用log4j的log4j.logger.org.hibernate.cache=debug,更方便看到ehcache的操作過程,主要用于調(diào)試過程,實(shí)際應(yīng)用發(fā)布時(shí)候,請(qǐng)注釋掉,以免影響性能。

          5、 使用ehcache,打印sql語句是正常的,因?yàn)閝uery cache設(shè)置為true將會(huì)創(chuàng)建兩個(gè)緩存區(qū)域:一個(gè)用于保存查詢結(jié)果集 (
          org.hibernate.cache.StandardQueryCache);另一個(gè)則用于保存最近查詢的一系列表的時(shí)間戳(org.hibernate.cache.UpdateTimestampsCache)。
          請(qǐng)注意:在查詢緩存中,它并不緩存結(jié)果集中所包含的實(shí)體的確切狀態(tài);它只緩存這些實(shí)體的標(biāo)識(shí)符屬性的值、以及各值類型的結(jié)果。
          需要將打印sql語句與最近的cache內(nèi)容相比較,將不同之處修改到cache中,所以查詢緩存通常會(huì)和二級(jí)緩存一起使用。

          英文參考資料:http://ehcache.sourceforge.net/documentation/#mozTocId258426
          博文參考:http://blog.csdn.net/yun15291li/archive/2006/02/21/604095.aspx
                           http://zyl.javaeye.com/blog/68369
          其他:http://dev.yesky.com/157/2557157.shtml

          posted on 2008-06-30 21:45 阿蜜果 閱讀(8008) 評(píng)論(3)  編輯  收藏 所屬分類: Java


          FeedBack:
          # re: 【轉(zhuǎn)】配置ehcache.xml文件
          2009-11-26 13:29 | djb26
          “ 如果不設(shè)置“查詢緩存”,那么hibernate只會(huì)緩存使用load()方法獲得的單個(gè)持久化對(duì)象,"這是為什么?我不用查詢緩存時(shí)用get也能獲得緩存啊?  回復(fù)  更多評(píng)論
            
          # re: 【轉(zhuǎn)】配置ehcache.xml文件
          2010-12-26 15:33 | java戀人
          阿米果-朋友,你懂葡萄牙語?  回復(fù)  更多評(píng)論
            
          # re: 【轉(zhuǎn)】配置ehcache.xml文件
          2010-12-26 16:20 | 阿蜜果
          @java戀人
          沒有咯,只是喜歡Amigo這個(gè)英文名
            回復(fù)  更多評(píng)論
            
          <2008年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

                生活將我們磨圓,是為了讓我們滾得更遠(yuǎn)——“圓”來如此。
                我的作品:
                玩轉(zhuǎn)Axure RP  (2015年12月出版)
                

                Power Designer系統(tǒng)分析與建模實(shí)戰(zhàn)  (2015年7月出版)
                
               Struts2+Hibernate3+Spring2   (2010年5月出版)
               

          留言簿(263)

          隨筆分類

          隨筆檔案

          文章分類

          相冊(cè)

          關(guān)注blog

          積分與排名

          • 積分 - 2298247
          • 排名 - 3

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 宝山区| 吉安县| 砀山县| 高州市| 西盟| 固阳县| 汽车| 鞍山市| 保靖县| 望谟县| 灵石县| 龙泉市| 婺源县| 娄底市| 武汉市| 孝感市| 中西区| 天峻县| 甘洛县| 新田县| 桦川县| 青海省| 武功县| 雷山县| 紫金县| 莱州市| 兴城市| 措勤县| 乐平市| 抚宁县| 仁寿县| 崇左市| 延吉市| 陕西省| 苏尼特右旗| 逊克县| 顺昌县| 湖南省| 连州市| 临洮县| 彰化市|