• Hibernate中的Session缓存问题


    1. Session 缓存:

    1 .  Session 接口的实现中包括一系列的 Java 集合 , 这些 Java 集合构成了 Session 缓存 .
             用于存放 Session 关联的对象 Session 关联对象的方式有非常多种。

            
             比如:session.get (Class , OID ) session.update() session.save ()  ...)。
             仅仅要 Session 实例没有结束生命周期 , 且没有清理缓存。则存放在它缓存中的对象也不会结束生命周期。

            Session 缓存可降低 Hibernate 应用程序訪问数据库的频率

    2 . 操作 Session 缓存的方法(了解一下吧)。


        . 若调用 session.get () 从数据库中载入一个对象。则该对象会被纳入到 Session 缓存中。

            News news = (News ) session.get (News.class , 1);

        //会向数据库发送 SQL  ? 不会发送 SQL 语句 , 而是从 Session 缓存获取对象的引用(快照)
            News news2 = (News ) session.get (News.class , 1);

        . Session  clear() 方法能够清空 Session 的缓存

        News news = (News) session.get(News.class, 1);

        //清理   session 缓存
            session.clear ();
            
        //会向数据库发送 SQL  ?  ! 由于 Session 缓存被清空了 !
            News news2 = (News ) session.get (News.class , 1);

    . Session  flush() 方法
        清理缓存 - 强制使数据库记录和 Session 缓存中对象状态保持一致,可能会发送 SQL 语句
       (若数据库记录和 Session 中对象状态不一致。则发送 SQL。否则不发送 SQL

        I. 默认情况下,提交事务时,会先清理缓存。然后再提交事务

        II. 若主键生成方式使用的是数据库底层的自增长方式。会在运行 Session  save() 方法时,就清理缓存,运行 INSERT 语句。而不是等到提交事务时。 Hibernate 要求和 Session 关联的对象必须有和数据表记录相应的 OID,这就意味着运行 save() 方法后。必须有 OID ,而底层自增长的方式生成主键,必须先运行 INSERT 才干获取主键值

        //若使用 MySQL 底层自增的方式生成主键, save() 方法即会引起发送 INSERT 语句
            session.save (news );
            System.out.println (news.getId ());

        III. 使用 HQLHibernate Query Language )查询记录时,不经过 Session 缓存!直接查询数据库,且要求查询的结果是最新的。
        所以,在进行 HQL 查询之前须要先清理缓存
        session.save(news);

        //会导致清理缓存
        News news2 = (News) session.createQuery ("FROM News n WHERE n.id = ?" )
                                              .setInteger (0 , news.getId ()).uniqueResult ();

        IV. commit()  flush() 方法的差别
             flush 运行一系列 sql 语句,但不提交事务;
            commit 方法先调用flush() 方法,然后提交事务 . 意味着提交事务对数据库的操作永久保存下来。

    . refresh () 方法:
        强制使 Session 缓存中的对象的状态和数据库记录保持一致。

    所以会强制发送一条 SELECT 语句。

        注意,由于 MySQL 的默认的隔离级别为 READ REPTABLE 。所以须要设置事务的隔离级别才干看到实验的效果

        <!-- 设置 Hibernate 的事务的隔离级别, 设置为读已提交 -->
        <property name ="connection.isolation" >2 </property >




  • 相关阅读:
    ARM 64位系统下运行32位程序
    CMakeFiles示例
    Linux c++ 试验10 一例undefined reference to symbol 'pthread_create@@GLIBC_2.2.5'”
    EclipseC++学习笔记9 将文件从项目中排除与恢复
    WSL 一例运行时提示access denied解决办法
    arm64环境搭建2 几个小tip
    飞凌FCU2201 使用2 设置wifi sta模式
    minicom退出
    linux出现TIME_WAIT的原因
    模板类出现 undefined reference 错误
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5396400.html
Copyright © 2020-2023  润新知