ehcache-----在spring和hibernate下管理ehcache和query cache

时间:2021-07-12 05:19:56

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

    如果不设置“查询缓存”,那么hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用findall()、 list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,就需要设置hibernate.cache.use_query_cache true 才行

2.首先设置EhCache,建立配置文件ehcache.xml,默认的位置在class-path,可以放到你的src目录下:
ehcache-----在spring和hibernate下管理ehcache和query cache  < ehcache >
ehcache-----在spring和hibernate下管理ehcache和query cache
ehcache-----在spring和hibernate下管理ehcache和query cache    
<!--  Sets the path to the directory where cache .data files are created.
ehcache-----在spring和hibernate下管理ehcache和query cache
ehcache-----在spring和hibernate下管理ehcache和query cache     If the path is a Java System Property it is replaced by
ehcache-----在spring和hibernate下管理ehcache和query cache     its value in the running VM.
ehcache-----在spring和hibernate下管理ehcache和query cache     The following properties are translated:
ehcache-----在spring和hibernate下管理ehcache和query cache     user.home 
-  User ' s home directory
ehcache-----在spring和hibernate下管理ehcache和query cache
     user.dir  -  User ' s current working directory
ehcache-----在spring和hibernate下管理ehcache和query cache
     java.io.tmpdir  -  Default temp file path  -->
ehcache-----在spring和hibernate下管理ehcache和query cache     
<!--< diskStore path = " java.io.tmpdir " />-->
ehcache-----在spring和hibernate下管理ehcache和query cache     
< diskStore path = " /data/ehcache " />
ehcache-----在spring和hibernate下管理ehcache和query cache
ehcache-----在spring和hibernate下管理ehcache和query cache    
<!-- Default Cache configuration. These will applied to caches programmatically created through
ehcache-----在spring和hibernate下管理ehcache和query cache        the CacheManager.
ehcache-----在spring和hibernate下管理ehcache和query cache
ehcache-----在spring和hibernate下管理ehcache和query cache        The following attributes are required:
ehcache-----在spring和hibernate下管理ehcache和query cache
ehcache-----在spring和hibernate下管理ehcache和query cache        maxElementsInMemory            
-  Sets the maximum number of objects that will be created in memory
ehcache-----在spring和hibernate下管理ehcache和query cache        eternal                                     
-  Sets whether elements are eternal. If eternal,  timeouts are 
ehcache-----在spring和hibernate下管理ehcache和query cache                                                            ignored and the element is never expired.
ehcache-----在spring和hibernate下管理ehcache和query cache        overflowToDisk                      
-  Sets whether elements can overflow to disk when the in - memory cache
ehcache-----在spring和hibernate下管理ehcache和query cache                                                        has reached the maxInMemory limit.
ehcache-----在spring和hibernate下管理ehcache和query cache
ehcache-----在spring和hibernate下管理ehcache和query cache        The following attributes are optional:
ehcache-----在spring和hibernate下管理ehcache和query cache        timeToIdleSeconds           
-  Sets the time to idle  for  an element before it expires.
ehcache-----在spring和hibernate下管理ehcache和query cache                                                        i.e. The maximum amount of time between accesses before an
ehcache-----在spring和hibernate下管理ehcache和query cache                                                        element expires Is only used 
if  the element is not eternal.
ehcache-----在spring和hibernate下管理ehcache和query cache                                                        Optional attribute. A value of 
0  means that an Element can idle
ehcache-----在spring和hibernate下管理ehcache和query cache                                                       
for  infinity.The  default  value is  0 .
ehcache-----在spring和hibernate下管理ehcache和query cache        timeToLiveSeconds             
-  Sets the time to live  for  an element before it expires.
ehcache-----在spring和hibernate下管理ehcache和query cache                                                         i.e. The maximum time between creation time and when an element 
ehcache-----在spring和hibernate下管理ehcache和query cache                                                         expires.  Is only used 
if  the element is not eternal.
ehcache-----在spring和hibernate下管理ehcache和query cache                                                         Optional attribute. A value of 
0  means that and Element can live
ehcache-----在spring和hibernate下管理ehcache和query cache                                                        
for  infinity.
ehcache-----在spring和hibernate下管理ehcache和query cache                                                        The 
default  value is  0 .
ehcache-----在spring和hibernate下管理ehcache和query cache        diskPersistent                           
-  Whether the disk store persists between restarts of the Virtual
                                                             Machine.
ehcache-----在spring和hibernate下管理ehcache和query cache                                                         The 
default  value is  false .
ehcache-----在spring和hibernate下管理ehcache和query cache        diskExpiryThreadIntervalSeconds   
-  The number of seconds between runs of the disk expiry thread. 
ehcache-----在spring和hibernate下管理ehcache和query cache                                                         The 
default  value  is  120  seconds.
ehcache-----在spring和hibernate下管理ehcache和query cache        
-->
ehcache-----在spring和hibernate下管理ehcache和query cache
ehcache-----在spring和hibernate下管理ehcache和query cache    
< defaultCache
ehcache-----在spring和hibernate下管理ehcache和query cache        maxElementsInMemory
= " 10000 "
ehcache-----在spring和hibernate下管理ehcache和query cache        eternal
= " false "
ehcache-----在spring和hibernate下管理ehcache和query cache        overflowToDisk
= " true "
ehcache-----在spring和hibernate下管理ehcache和query cache        timeToIdleSeconds
= " 120 "
ehcache-----在spring和hibernate下管理ehcache和query cache        timeToLiveSeconds
= " 120 "
ehcache-----在spring和hibernate下管理ehcache和query cache        diskPersistent
= " false "
ehcache-----在spring和hibernate下管理ehcache和query cache        diskExpiryThreadIntervalSeconds
= " 120 " />
ehcache-----在spring和hibernate下管理ehcache和query cache    
< cache name = " org.hibernate.cache.UpdateTimestampsCache "  maxElementsInMemory = " 5000 "  
ehcache-----在spring和hibernate下管理ehcache和query cache     eternal
= " true "  overflowToDisk = " true " />
ehcache-----在spring和hibernate下管理ehcache和query cache    
< cache name = " org.hibernate.cache.StandardQueryCache "  maxElementsInMemory = " 5 "  eternal = " false "
ehcache-----在spring和hibernate下管理ehcache和query cache    timeToLiveSeconds
= " 120 "  overflowToDisk = " true " />
ehcache-----在spring和hibernate下管理ehcache和query cache    
< cache name = " userCache "  maxElementsInMemory = " 100000 "  eternal = " false "  timeToIdleSeconds =
        "
600 "    timeToLiveSeconds = " 600 "  overflowToDisk = " false "  diskPersistent = " false " />
ehcache-----在spring和hibernate下管理ehcache和query cache    
< cache name = " com.ouou.webapp.util.OuouMethodIntecepter "  maxElementsInMemory = " 100000 "  
ehcache-----在spring和hibernate下管理ehcache和query cache    eternal
= " false "  timeToIdleSeconds = " 600 "  timeToLiveSeconds = " 600 "  overflowToDisk = " false "
ehcache-----在spring和hibernate下管理ehcache和query cache    diskPersistent
= " false " />
ehcache-----在spring和hibernate下管理ehcache和query cache    
< cache name = " bbcode "  maxElementsInMemory = " 100000 "  eternal = " false "  timeToIdleSeconds = " 600 "
ehcache-----在spring和hibernate下管理ehcache和query cache    timeToLiveSeconds
= " 600 "  
ehcache-----在spring和hibernate下管理ehcache和query cache    overflowToDisk
= " false "  diskPersistent = " false " />
ehcache-----在spring和hibernate下管理ehcache和query cache    
< cache name = " com.ouou.model.Videos "  maxElementsInMemory = " 10000 "   eternal = " false "  
ehcache-----在spring和hibernate下管理ehcache和query cache    overflowToDisk
= " false "  timeToIdleSeconds = " 120 "  timeToLiveSeconds = " 120 "  diskPersistent = " false " />
ehcache-----在spring和hibernate下管理ehcache和query cache    
< cache name = " com.ouou.model.Tags "  maxElementsInMemory = " 10000 "   eternal = " false "
ehcache-----在spring和hibernate下管理ehcache和query cache    overflowToDisk
= " false "  timeToIdleSeconds = " 120 "  timeToLiveSeconds = " 120 "  diskPersistent = " false " />
ehcache-----在spring和hibernate下管理ehcache和query cache
</ ehcache >

以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中,所以查询缓存通常会和二级缓存一起使用。

英文参考资料: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