用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> <!--如果对象过期,当查询的时候不会打缓存当中找而会直接查询数据库-->
基本的配置也就这样子,如有不到位的地方希望各位同仁指点下啊