您的位置:首页 > 其它

SSH与SSM学习之hibernate11——hibernate的二级缓存

2017-09-17 17:35 387 查看
SSH与SSM学习之hibernate11hibernate的二级缓存
一一级缓存解决不了多个session的问题

二二级缓存

三二级缓存配置步骤
1 添加二级缓存对应的jar包

2 在hibernate的主配置文件中添加配置

3 添加二级缓存的属性配置文件

4 在需要被缓存的表所对应的映射文件中添加标签

四标签说明
1 usage

2 include

3 region

五代码测试
1 测试代码

2 没有二级缓存的结果

3 有二级缓存的结果

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.xmlsrc

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

这个具体含义可以查看

详解Hibernate中的二级缓存

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}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: