用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>
<!--如果对象过期,当查询的时候不会打缓存当中找而会直接查询数据库-->
基本的配置也就这样子,如有不到位的地方希望各位同仁指点下啊
本文详细解析Hibernate缓存概念,重点介绍了一级缓存与二级缓存的区别与配置,通过实例展示了如何在核心配置文件、对象映射文件及ehcache配置文件中进行二级缓存的配置,并提供了ehcache.xml配置文件示例。
743

被折叠的 条评论
为什么被折叠?



