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

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}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值