hibernate 缓存 4.3

时间:2024-07-23 22:06:44

缓存在hibernate中是天生就有的,是一级缓存,当session关闭时一级缓存就失效了

一级缓存是内置的,生效范围是在同一个session中才行.二级缓存是需要配置才有

判断当前项在不在一级缓存中,contains

session.beginTransaction();

User u1 = (User) session.get(User.class, 27);
//session.clear();
//session.evict(u1);
System.out.println(session.contains(u1));
session.getTransaction().commit();

clear方法和evict方法

clear方法用于将所有对象从一级缓存中清除
evict方法用于将指定对象从一级缓存中清除

二级缓存 

在Hibernate中二级缓存在SessionFactory中实现,由一个SessionFactor
的所有Session实例所共享。Session在查找一个对象时,会首先在自己的
一级缓存中进行查找,如果没有找到,则进入二级缓存中进行查找,如果二级缓
存中存在,则将对象返回,如果二级缓存中也不存在,则从数据库中获得。

1.在根目录中配置ehcache.xml 

<?xml version="1.0" encoding="UTF-8"?>
<ehcache> <diskStore path="java.io.tmpdir"/> <defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
</ehcache>

2.pom.xml中添加jar包依赖

<!-- \hibernate-release-4.2.0.Final\hibernate-release-4.2.0.Final\lib\optional\ehcache -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.6.6</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>4.2.0.Final</version>
</dependency>

3.开启二级缓存

开启二级缓存 使用EhCache实现  在hibernate.cfg.xml配置

路径是导入的jar包(hibernate-ehcache)的EhCacheRegionFactory路径

<property name="cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

4.使用2级缓存  

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.kaishengit.pojo"> <class name="User" table="user">
<!-- 这里表示使用2级缓存,缓存user,也只有查询user才使用2级缓存 -->
<cache usage="read-write"/>
<id name="id">
<generator class="native"/>
</id> <property name="username"/>
<property name="password"/> <set name="addressSet" cascade="delete" inverse="true">
<!-- 这里表示查询Address,2级缓存有效,会缓存address的id,所以再使用时会有根据id查询address的sql
如果要缓存address对象,就要在address.hbm.xml中配置.-->
<cache usage="read-write"/>
<key column="userid"/>
<one-to-many class="Address"/>
</set> </class> </hibernate-mapping>

read-only:只读。对于不会发生改变的数据,可以使用只读性缓存。
read-write:可读写缓存。用于对数据同步要求严格的情况。
nonstrict-read-write:如果程序对并发访问下的数据同步要求不是很严格,
且数据更新操作不频繁时可采用该缓存策略