Hibernate 二级缓存的配置和使用

用Hibernate做了些项目感觉Hibernat之所以如此流行主要是两个方面:

 

1、是一个Orm的轻量级实现,让我们可以使用面向对象的方式对数据库进行操作,显得更加方便,代码更加精炼。

2、提供了缓存机制,取数据时不一定要都查询数据库,可以从缓存中取,减少了访问数据库的次数,提高了性能。

 

缓存的概念:

 

缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。

 

Hibernate主要保存了两级缓存:

一级缓存:

就是Session缓存,由于Session对象的生命周期对应的是一个数据库事务或一个应用级事务,因此可以一级缓存是事务级的缓存,一级缓存是必须的,不允许而且事实上也是无法被卸载,在一级缓存中每个持久化的对象都有一个唯一的OID.

 

二级缓存:

可以说是一个可选的缓存插件。它是有SessionFactory负责管理。由于SessionFactory对于是程序整个过程,因此第二级缓存是进程或集群范围的缓存,因此可能出现并发性问题,因此要采用适当的事务隔离级别。这个缓存保存是对象的松散型数据,为了把第三方的插件和Hibernate集成起来,Hibernate提供了一个缓存适(org.hibernate.cache .CacheProvider),也就是一个接口让第三方插件产生的插件实现提供了好的标准。

 

 

为了很好的利用缓存带给我们好处,下面我们来看看二级缓存的配置方法:以org.hibernate.cache.EhCacheProvider
这个缓存插件的配置为例:

 

首先,我在Hibernte的核心配置文件中加上这么一段:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

	<session-factory>
		<property name="connection.username">sa</property>
		<property name="connection.url">
			jdbc:sqlserver://localhost:1433;databaseName=test
		</property>
		<property name="dialect">
			org.hibernate.dialect.SQLServerDialect
		</property>
		<property name="myeclipse.connection.profile">
			SQL Server2005
		</property>
		<property name="connection.password">123</property>
		<property name="connection.driver_class">
			com.microsoft.sqlserver.jdbc.SQLServerDriver
		</property>
		<property name="show_sql">true</property>
		<property name="sql_format">true</property>
		
		
	
		<!-- 声明使用二级缓存-->
		<property name="hibernate.cache.use_second_level_cache">true</property>
		 
		 
		 
		<!-- 配置二级缓存的实现类 -->
		<property name="hibernate.cache.provider_class">
			org.hibernate.cache.EhCacheProvider
		</property>
		
		
		
		<mapping resource="entity/Team.hbm.xml" />
		<mapping resource="entity/Student.hbm.xml" />
		 

	</session-factory>

</hibernate-configuration>

 

然后再对象映射文件的集合属性:

 

    <set name="students" cascade="all" inverse="true" lazy="false">
        
        	<!-- 对集合中的对象放入缓存中 -->
        	
        	<cache usage="read-write"/>
        	<key>
        		<column name="tid"></column>
        	</key>
        	<one-to-many class="entity.Student"/>
        </set>

 对集合中的类对应的配置问中的class标签下加入:

 

 <class name="Student" table="Student" >
    
    	<cache usage="read-write"/>

</class>

 

 

最后,我们还要针对缓存提供一个配置文件,放在项目的src目录下

 

文件名为:ehcache.xml,一般在我们下载的Hibernate框架包下面的etc文件夹中找的到。

 

如下:

<?xml version="1.0" encoding="UTF-8"?>

<!-- 缓存的配置文件 -->

<ehcache>
	<!-- 
	
		diskStore标签:硬盘保存
		
		属性:
		path:保存的位置	
		
	 -->
	<diskStore  path="D:/ehcache" />
	
	
	<!--
		defaultCache标签:指定默认的缓存配置:
		
		属性:
		maxElementsInMemory:在内存中保存对象的个数
		eternal:是否是不变的
		timeToIdleSeconds:从上次使用到过期的时间
		timeToLiveSeconds:对象自创建到过期存活时间
		overflowToDisk:超过内存的个数是否保存到硬盘
	  -->
	<defaultCache maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        overflowToDisk="true" />
	
	<!-- 
		cache标签:对指定的类进行缓存配置
	
		属性和上面默认属性一样,如果设置了就覆盖上面的默认设置,没有设置,则引用默认设置
	 -->	
		
	<cache name="entity.Student"
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="300"
        timeToLiveSeconds="600"
        overflowToDisk="true" />

</ehcache>

<!--如果对象过期,当查询的时候不会打缓存当中找而会直接查询数据库-->

 

基本的配置也就这样子,如有不到位的地方希望各位同仁指点下啊

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值