报错 : org.hibernate.cache.NoCachingEnabledException: Second-level cache is not enabled for usage
参考:http://www.cnblogs.com/hoojo/archive/2012/07/12/2587941.html
1.打开二级缓存的配置——applicationContext.xml<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<!-- 设置方言 -->
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<!-- 格式化输出的sql语句(可选) -->
<prop key="hibernate.format_sql">
true
</prop>
<!-- 是否打印sql语句 -->
<prop key="hibernate.show_sql">
false
</prop>
<!-- 配置二级缓存 -->
<prop key="hibernate.cache.use_second_level_cache">
true
</prop>
<!-- 由于查询的缓存命中率很低,所以我们关掉查询时的二级缓存 -->
<prop key="hibernate.cache.use_query_cache">
false
</prop>
<!-- 配置二级缓存的相应的类 -->
<prop key=" hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>bean/Person.hbm.xml</value>
</list>
</property>
</bean>
注意我标注的红色部分,这块就是配置二级缓存,具体解释有注释,在最后一个配置项中配置了二级缓存的类,这个类为外部类,所以要加入ehcache的jar包。
2.设置Ehcache默认的配置文件——ehcache.xml(放在类路径下,src目录下)
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<diskStore path="D:/cache"/>
<defaultCache maxElementsInMemory="1000" eternal="false" overflowToDisk="true"
timeToIdleSeconds="120"
timeToLiveSeconds="180"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="60"/>
<cache name="bean.Person" maxElementsInMemory="100" eternal="false"
overflowToDisk="true" timeToIdleSeconds="300" timeToLiveSeconds="600" diskPersistent="false"/>
</ehcache>
<!--下面是解释 -->
<!-- path定义缓存的对象默认存放到哪里 -->
<!--defaultCache节点为缺省的缓存策略 -->
<!--maxElementsInMemory为内存中最大允许存在的对象数量 -->
<!--eternal设置缓存中的对象是否永远不过期-->
<!--overflowToDisk 把溢出的对象存放到硬盘上 -->
<!--timeToIdleSeconds 指定缓存对象空闲多长时间就过期,过期的对象会被清除掉 -->
<!--timeToLiveSeconds指定缓存对象总的存活时间 -->
<!--diskPersistent 当jvm结束是是否持久化对象 -->
<!--diskExpiryThreadIntervalSeconds 指定专门用于清除过期对象的监听线程的轮询时间 -->
<!--cache中是定义一些特别的缓存,如果不进行cache的定义,那么就会采用默认的缓存技术,上面我是为这个类定义缓存 -->
注意我上面的配置文件,蓝色部分如果没有必要就不用配置。如果不配置,那么就采用的是默认的缓存技术(defaultCache中的配置),如果配置了就采用他自己的配置。
3.为需要缓存的类添加缓存配置——xxx.hbm.xml
<hibernate-mapping>
<class name="bean.Person" table="employee" catalog="test">
<!-- usage中配置缓存策略,当两个并发的事务可以对他同时读,但是如果一个事务对他写的话,另外一个事务就不能读 -->
<!-- bean中定义实体类 -->
<cache usage="read-write" region="bean.Person"/>
<id name="empid" type="java.lang.Integer">
<column name="empid" />
<generator class="identity" />
</id>
注意我配置的红色部分,usage中配置的是缓存策略,read-write表示两个并发的事务可以同时对他读,但是如果一个事务对他写,另外一个事务就不能读。
4.学会了配置回来看看理论——什么是缓存
缓存是数据库数据临时容器,它包含了库表数据的临时拷贝,位于数据库与数据访问层之间。ORM进行数据读取时,会根据其缓存管理策略,首先在内存中查询,如果在内存中发现所需数据(缓存命中),则直接以此数据错位查询结果加以利用,从而避免了数据库调用的性能开销。
缓存的介质一般是内存,所以读写速度很快。但如果缓存中存放的数据量非常大时,也会用硬盘作为缓存介质。缓存的实现不仅仅要考虑存储的介质,还要考虑到管理缓存的并发访问和缓存数据的生命周期。
5.学会了配置回来看看理论——hibernate中的两个级别的缓存
Hibernate中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存由hibernate管理的,一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存。这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载。 Hibernate还为查询结果提供了一个查询缓存,它依赖于第二级缓存。
6.学会了配置回来看看理论——缓存策略详解
1)Read-only
只读。对于从来不会修改的数据,如参考数据,可以使用这种并发访问策略。
2)Nonstrict-read-write
非严格读写。如果程序对并发访问下的数据同步要求不是非常严格,且数据更新操作频 率较低(几个小时以上),可以采用这种并发访问策略,获得较好的性能。
3)Read-write
严格读写。提供了Read Committed事务隔离级别。仅仅在非集群的环境中适用。对于经常被读但很少修改的数据,可以采用这种隔离类型,因为它可以防止脏读这类的并发问题。
4) Transactional
事务。仅仅在托管环境中适用。它提供了Repeatable Read事务隔离级别。对于经常被读但很少修改的数据,可以采用这种隔离类型,因为它可以防止脏读和不可重复读这类的并发问题。