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

原创 2007年09月28日 14:53:00

1. 在Hibernate配置文件中设置:
    
<!-- 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>

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

2.首先设置EhCache,建立配置文件ehcache.xml,默认的位置在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标签下面,其他位置无效。
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

相关文章推荐

Hibernate中的Query cache(查询缓存)

对于经常用到的查询语句,如果其中的查询参数是固定的,则可以将这样的查询结果也存储到Hibernate的二级缓存中。 应用中设置了查询缓存后,查询的结果集将被存储到缓存中,但并非缓存结果集中具体的en...

使用spring和hibernate配置ehcache和query cache

msn:yun15291li@hotmail.comHibernate ehcache and query cache配置环境:spring1.2.5+hibernate3.0.51、 applica...

Hibernate缓存配置/批量处理

Hibernate除了自动对Session级别的事务进行一级缓存外,二级缓存都需要实现org.hibernate.cache.CacheProvider接口,Hibernate已经实现了一些缓存,开发...

Hibernate ehcache缓存配置详解+实战

依赖管理我这里使用的maven来管理的依赖,pom如下: org.hibernate hibernate-core 5.0.2.Final org....

Ehcache(05)——缓存的查询

缓存的查询 目录 1.    使Cache可查询 1.1     基于Xml配置 1.2     基于代码的配置 2     指定可搜索的属性 2.1     可查询属性类型 2.2  ...

Ehcache缓存的使用

Ehcache缓存的使用

Hibernate之Hibernate+EHCache配置二级缓存实战

准备条件: 我使用的版本是:hibernate-release-4.2.2.Final Hibernate必须的jar包:hibernate-4.2.2\hibernate-release-4.2.2...
  • yhl_jxy
  • yhl_jxy
  • 2016年03月17日 11:27
  • 5622

Maven 3 + Hibernate 4 + Spring 3 + Ehcache + Spring Cache

介绍 这是一个集成二级缓存(确切的说是ehcache)和spring3以及hibernate4.1的一个快速指导 下边是所使用的api的版本和框架的版本 Java 1.6 Spring 3.2...

Ehcache系列三:Spring Cache 介绍

转自:http://www.cnblogs.com/rollenholt/p/4202631.html 缓存是实际工作中非常常用的一种提高性能的方法, 我们会在许多场景下来使用缓存。 本文...

spring security 3配置ACL时报java.lang.NoSuchMethodError: net.sf.ehcache.Cache.<init>

严重: Exception sending context initialized event to listener instance of class org.springframework.we...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ehcache-----在spring和hibernate下管理ehcache和query cache
举报原因:
原因补充:

(最多只允许输入30个字)