Spring整合Hibernate4二级缓存

以常见的EhCahe为例介绍Spring结合Hibernate二级缓存的用法


现在已经把Hibernate的配置文件整合到Spring的配置文件applicationContext.xml中,


1、在Bean为sessionFactory的hibetnateProperties开启二级缓存。需要做两件事:

a、设置启用二级缓存

b、设置二级缓存的实现类

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
		p:dataSource-ref="dataSource">
		<!-- 使用包扫描模式自动全部持久化类 -->
		<property name="packagesToScan">
			<value>com.sparta.shopping.entity</value>
		</property>
		<!-- 有关数据库的一些特性 -->
		<property name="hibernateProperties">
			<props>
				<!-- 制定Hibernate的连接方言 -->
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
				<!-- 是否显示更多的sql语句 -->
				<prop key="hibernate.show_sql">true</prop>
				<!-- 是否根据Hibernate映射创建数据表 -->
				<prop key="hibernate.hbm2ddl.auto">update</prop>
				<!-- 开启二级缓存 -->
				<prop key=" hibernate.cache.use_second_level_cache">true</prop>
				<!-- 启用查询缓存 -->
				<prop key=" hibernate.cache.use_query_cache">true</prop>
				<!-- 配置二级缓存提供商 -->
				<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
				<!-- 加载缓存所需配置文件 -->
				<prop key="hibernate.net.sf.ehcache.configurationResourceName">classpath:ehcache.xml</prop>
			</props>
		</property>
	</bean>


2、复制二级缓存的jar包。

        将Hibernate项目路径下的lib\optional\ehcache包下的ehcache-core-2.4.3.jar、hibernate-ehcache-4.3.10.Final.jar、slf4j-api-1.6.1.jar的三个主要jar包导入项目类加载路径。(jar名字的后面数字只是一个版本,可以不同)

3、将缓存实现所需要的配置文件添加到系统的类加载路径。

       对于EhCache缓存,它需要一个ehcache.xml配置文件,本应用所使用ehcache.xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
	<diskStore path="D:/cache/" />
	<defaultCache maxElementsInMemory="10000" eternal="false"
		timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
		diskPersistent="false" diskExpiryThreadIntervalSeconds="60" />
</ehcache>


maxElementsInMemory:属性用于指定缓存中最多可放多少个对象。
eternal                           :属性指定缓存是否永久有效。
timeToIdleSeconds       :属性指定缓存多久未被使用便清理掉。
timeToLiveSeconds      :属性指定缓存的生命长度。
diskPersistent               :属性指定缓存是否被持久化到硬盘中,保存路径由<diskStore>标签指定。


4、设置对哪些持久实体类、实体的哪些集合属性启用二级缓存。这一步有两种方式。

a、使用注解:

      在持久实体类中加上注解@Cache(usage = CacheConcurrencyStrategy.READ_WRITE),表明这是需要缓存的实体,其中缓存策略是READ_WRITE,允许更改数据

b、使用hibernate.cfg.xml文件和xxx.hbm.xml文件,具体配置这里不作介绍.

@Entity
@Table(name = "category", catalog = "shop")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Category implements java.io.Serializable {

	private Integer id;
	private String type;
	private Boolean hot;
	private Account account;

	public Category() {
	}
	//省略所有属性的setter和getter方法,以及在getter方法前的注解
}


至此,就可以开启二级缓存了。



FAQ:

Q:是否开启了二级缓存?

A:我们必须在Hibernate中设置<prop key="hibernate.show_sql">true</prop>,以显示我们向数据库发送sql语句时,能够在控制台输出信息,控制台显示发送sql语句如下

Hibernate: select product0_.id as id1_2_0_, category1_.id as id1_1_1_, product0_.cid ....

在第一次我们查询第4步中的已经设置了二级缓存的实体类或者对象时,控制台会显示Hibernate向数据库发送的sql语句,当我们第二次再查询时,此时控制台已经不会再显示向数据库发送的sql语句,因为此时它直接在缓存中查找(因为该对象在缓存中存在),而不是到数据中查找了。


Q:查询相同的对象总是显示sql语句?

A:A-->B-->C,假设A引用B,B引用C,其中A和B都设置为缓存对象,但C没有设置,所以每次查询即使相同时,还是要查询C对象,但C对象并没有保存在缓存中,所以还是需要向数据库发送sql语句.


有关缓存的一些基本流程:



  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值