SSH与SSM学习之hibernate11——hibernate的二级缓存
一、一级缓存解决不了多个session的问题
比如现在我们查询的数据,基本是不变的,在一级缓存(session缓存)下,我们如果是同一个session,那么有数据被缓存,但是如果我们是多个session的话,那么我们还是会多次去访问数据。然而由于数据是不变的,我们完全没必要呀。我们想要实现的就是多个session也能够直接使用,而不去查询,这样我们的二级缓存就来了。
二、二级缓存
二级缓存是SessionFactory级别的缓存,是属于进程范围的缓存。
二级缓存又称为“全局缓存”、“应用缓存”
二级缓存中的数据可适用范围是当前应用程序的所有回话
二级缓存是可插拔式缓存,默认是 EHCache,还支持其他二级缓存组件
例如:Hashtable、OSCache、SwarmCache、JBoss TreeCache等
三、二级缓存配置步骤
3.1 添加二级缓存对应的jar包
在我们下载的 hibernate 的文件中,有个路径是 lib\optional\ehcache,导入里面的jar包.
例如我们的是
ehcache-2.10.3.jar
hibernate-ehcache-5.2.11.Final.jar
slf4j-api-1.7.7.jar
不能缺少任何一个包哦。如果缺少了 hibernate-ehcache-5.2.11.Final.jar,会出现下面的错误
Caused by: org.hibernate.boot.registry.selector.spi.StrategySelectionException: Unable to resolve name [org.hibernate.cache.ehcache.EhCacheRegionFactory] as strategy [org.hibernate.cache.spi.RegionFactory ..........
3.2 在hibernate的主配置文件中添加配置
我们需要在hibernate.cfg.xml中添加相应的配置,我们需要添加如下配置。
Hibernate 4.0及以后
<!--配置二级缓存的外部实现类-->
<property name="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</property>
<!--开启二级缓存-->
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
Hibernate 3.3
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
3.3 添加二级缓存的属性配置文件
导入的 ehcache.xml 到 src下
3.4 在需要被缓存的表所对应的映射文件中添加标签
下载我们需要在我们需要使用二级缓存的配置文件中加入 标签。如下
<?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.qwm.hibernate02">
<class name="User" table="tb_user2">
<!--二级缓存配置-->
<cache usage="read-only" include="all" region="User"></cache>
<id name="id">
<!--id自增-->
<generator class="increment"></generator>
</id>
<property name="name"/>
<property name="age"/>
</class>
</hibernate-mapping>
四、标签说明
4.1 usage
usage:指定缓存策略,可选的策略是包括:transactional,read-write、nonstrict-read-write或read-only
这个具体含义可以查看
4.2 include
include(可选,默认为 all) non-lazy 当属性级延迟抓取打开时,标记为 lazy=”true” 的实
体的属性可能无法被
4.3 region
region (可选,默认为类或者集合的名字(class or collection role name)) 指定第二
级缓存的区域名(name of the second level cache region)
在 ehcache.xml 配置
五、代码测试
5.1 测试代码
/**
* 二级缓存,我们使用多个session来查询数据
*/
@Test
public void cacheTest1(){
//1.创建session
Session session = HibernateUtils.openSession();
//2.获取到数据
User user1 = session.get(User.class,1);
System.out.println(user1);
//3.创建新的session
session = HibernateUtils.openSession();
//4.获取数据
User user2 = session.get(User.class,1);
System.out.println(user2);
//5.关闭资源
session.close();
}
5.2 没有二级缓存的结果
Hibernate:
select
user0_.id as id1_0_0_,
user0_.name as name2_0_0_,
user0_.age as age3_0_0_
from
tb_user2 user0_
where
user0_.id=?
User{id=1, name='小明', age=20}
Hibernate:
select
user0_.id as id1_0_0_,
user0_.name as name2_0_0_,
user0_.age as age3_0_0_
from
tb_user2 user0_
where
user0_.id=?
User{id=1, name='小明', age=20}
5.3 有二级缓存的结果
Hibernate:
select
user0_.id as id1_0_0_,
user0_.name as name2_0_0_,
user0_.age as age3_0_0_
from
tb_user2 user0_
where
user0_.id=?
User{id=1, name='小明', age=20}
User{id=1, name='小明', age=20}