四、Hibernate

1. 二级缓存

Hibernate中的二级缓存,二级缓存是属于SessionFactory级别的缓存机制。第一级别的缓存是Session级别的缓存,是属于事务范围的缓存,由Hibernate管理,一般无需进行干预。第二级别的缓存是SessionFactory级别的缓存,是属于进程范围的缓存。

1.1 二级缓存分类:

  • 内置缓存:Hibernate自带的,不可卸载,通常在Hibernate的初始化阶段,Hibernate会把映射元数据和预定义的SQL语句放置到SessionFactory的缓存中。该内置缓存是只读的。

  • 外置缓存:通常说的二级缓存也就是外置缓存,在默认情况下SessionFactory不会启用这个缓存插件,外置缓存中的数据是数据库数据的复制,外置缓存的物理介质可以是内存或者硬盘。

  • hibernate 二级缓存的结构:

    图片.png

1.2 二级缓存并发访问策略

策略 使用场景
transactional(事务型) 提供Repeatable Read事务隔离级别;适用经常被读,很少修改的数据;可以防止脏读和不可重复读的并发问题;缓存支持事务,发生异常的时候,缓存也能够回滚
read-write(读写型) 提供Read Committed事务隔离级别;在非集群的环境中适用;适用经常被读,很少修改的数据;可以防止脏读;更新缓存的时候会锁定缓存中的数据
nonstrict-read-write(非严格读写型) 适用极少被修改,偶尔允许脏读的数据(两个事务同时修改数据的情况很少见);不保证缓存和数据库中数据的一致性;为缓存数据设置很短的过期时间,从而尽量避免脏读;不锁定缓存中的数据
read-only(只读型) 适用从来不会被修改的数据(如参考数据);在此模式下,如果对数据进行更新操作,会有异常;事务隔离级别低,并发性能高;在集群环境中也能完美运作

分析总结,二级缓存应用场景:

适合放入二级缓存中数据

  • 很少被修改
  • 不是很重要的数据,允许出现偶尔的并发问题

不使用二级缓存数据

  • 经常被修改
  • 财务数据,绝对不允许出现并发问题
  • 与其他应用数据共享的数据

1.3 hibernate支持的缓存插件(缓存提供的供应商)

EHCache:可作为进程范围内的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持

OpenSymphony`:可作为进程范围内的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持

OSCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持

SwarmCache:可作为集群范围内的缓存,但不支持Hibernate的查询缓存

JBossCache:可作为集群范围内的缓存,支持Hibernate的查询缓存

缓存插件 并发策略支持如下图

图片.png

1.4 EHCache配置步骤

  • 导包 配置POM 文件,引入 ehcache 插件
    <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-ehcache</artifactId>
            <version>5.2.12.Final</version>
        </dependency>
  • 核心配置文件中 开启二级缓存
 <!--开启二级缓存-->
    <property name="hibernate.cache.use_second_level_cache">true</property>
    <!--配置 二级缓存的提供商-->
    <property name="hibernate.cache.region.factory_class">
      org.hibernate.cache.ehcache.EhCacheRegionFactory
    </property>
  • 开启类缓存
  <class name="com.xingxue.day5.hibernate.domain.UserModel" table="t_user">
        <!-- 开启二级缓存的类缓存 -->
        <cache usage="read-write"/>

注意:一级缓存对象的修改会影响二级缓存

  • 开启集合缓存
  <set name="userModels" table="t_user_role" inverse="true">
            <!--开启当前的集合缓存-->
            <cache usage="read-write"/>
  • 查询缓存:缓存的查询数据,要求 sql 以及参数要一模一样。
    <!--开启查询缓存,一定是在二级缓存的基础上才能使用-->
    <property name="hibernate.cache.use_query_cache">true</property>
    List<RoleModel> rs = session.createQuery("select r from RoleModel r  where r.id = 1 and 1 = 1")
                //查询的数据放入查询缓存中
                // 开启查询缓存
                .setCacheable(true)
                .list();
        session.close();

        Session session1 = factory.openSession();

        List<RoleModel> rs2 = session1.createQuery("from RoleModel where id = 1 and 1 = 1")
                .setCacheable(true)
                .list();

2.创建 Session 方式

  • sessionFactory.openSession()

  • sessionFactory.getCurrentSession()

  • 两种创建得到 session 的区别:
    openSession 每次得到session 是一个新的。
    openSession 每次得到session 事务手动提交,再关闭session
    getCurrentSession 获取session 要开启以下配置:

    <property name="hibernate.current_session_context_class">thread</property>

       getCurrentSession 获取session ,会检查当前线程上有没有session对象,如果有直接从线程上取,没有就调用openSession 创建一个新的 session 对象,并且把该session对象绑定到当前线程中。
       getCurrentSession 获取session,由于session 绑定了事务,所以在事务提交后,会自动的关闭session,如果手动再去关闭session 就会报错,但是在hibernate 5.2 以上的版本,就不会存在该问题。

实际开发中使用 getCurrentSession 获取session 对象,只不过将来的session 的上下文不是 线程,就来缓存 SpringSessionContext

3.IDEA 逆向 上课听讲就会,不听讲就百度

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容