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

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

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

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

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

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

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








Hibernate中的Session缓存问题的更多相关文章

  1. hibernate中的session缓存

    1.什么是session缓存? 在 Session 接口的实现中包含一系列的 Java 集合, 这些 Java 集合构成了 Session 缓存. 只要 Session 实例没有结束生命周期, 且没有 ...

  2. Hibernate中延迟加载和缓存

    什么是延迟加载? 延迟加载是指当应用程序想要从数据库获取对象时(在没有设置lazy属性值为false),Hibernate只是从数据库获取符合条件的对象的OId从而生成代理对象,并没有加载出对象 访问 ...

  3. 第四讲 :hibernate中的session

    hibernate中的session中可以进行增删改差,通过工具类可以得到相关的工具类. 方法概要:  Transaction beginTransaction()开始一个工作单元,得到关联的事务对象 ...

  4. 在Spring、Hibernate中使用Ehcache缓存(2)

    这里将介绍在Hibernate中使用查询缓存.一级缓存.二级缓存,整合Spring在HibernateTemplate中使用查询缓存.,这里是hibernate3,使用hibernate4类似,不过不 ...

  5. hibernate 中的session和事务(Transaction)

    在使用hibernate开发时,遇到最多的就是session与事务,那么他们两个有什么关系呢?下面我来抛砖引玉: 1.session是hibernate中的以及缓存机制,是用来对数据进行增删改查的一个 ...

  6. 关于hibernate中的session与数据库连接关系以及getCurrentSession 与 openSession() 的区别

    1.session与connection,是多对一关系,每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用.   2.多个sessi ...

  7. Hibernate-ORM:16.Hibernate中的二级缓存Ehcache的配置

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客讲述Hibernate中的二级缓存的配置,作者将使用的是ehcache缓存 一,目录 1.二级缓存的具 ...

  8. 具体解释Hibernate中的二级缓存

    1.前言 这篇博客再前几篇博客的基础上来解说一下.Hibernate中的二级缓存.二级缓存是属于SessionFactory级别的缓存机制. 第一级别的缓存是Session级别的缓存,是属于事务范围的 ...

  9. Hibernate中的Session

    我们之前也经常使用Session,通过连接服务器将需要保存的值存到服务器的session中,这是之前关于session的简单应用.现在看到Hibernate框架中也有关于Session的定义,该定义是 ...

随机推荐

  1. 2016-2017-2 20155309南皓芯《java程序设计》第七周学习总结

    教材学习内容总结 Lambda 一种匿名方法 表达式构成 括号以及括号里用逗号分隔的参数列表 仅有一个参数的可以省略括号 ->符号 花括号以及花括号里的语句 仅有一条语句时可以省略花括号,并且这 ...

  2. 20165333 2017-2018-2《Java程序设计》课程总结

    一.每周作业链接汇总 1.预备作业一:我期望的师生关系 简要内容: 印象深刻的老师 我期望的师生关系 关于JAVA学习 2.预备作业二:学习基础和C语言学习基础 简要内容: 技能学习 C语言学习 关于 ...

  3. Windows开机自动启动pageant,方便使用ssh链接到GitHub

    按win +r,输入 shell:startup "C:\Program Files\TortoiseGit\bin\pageant.exe" "d:\GitHubPri ...

  4. 快速php日志,写内容到文件,把日志写到log文件

    php 写内容到文件,把日志写到log文件 //记录日志:要写入文件的文件名(可以是任意文件名),如果文件不存在,将会创建一个.log.txt位置在项目的根目录下. $file = 'log.txt' ...

  5. ****jQuery - 设置HTML内容和属性

    设置内容 - text().html() 以及 val() 我们将使用前一章中的三个相同的方法来设置内容: text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元素的内容( ...

  6. OpenCV处理直方图

    直方图可以用来描述各种不同的事物,如物体的色彩分布.物体边缘梯度模板,以及表示目标位置的当前假设. 简单的说,直方图就是对数据进行统计,将统计值组织到一系列事先定义好的bin中.bin中的数值是从数据 ...

  7. pyinstaller 打包错误集锦

    最近在用 pyinstaller 打包项目的时候遇到如下错误: RecursionError: maximum recursion depth exceeded 解决方案 执行 pyinstaller ...

  8. TCP可靠传输及流量控制实现原理

    一.为什么TCP是可靠传输? 1. 停止等待协议 通过确认与超时重传机制实现可靠传输 在发送完一个分组后,必须暂时保留已发送的分组的副本. 分组和确认分组都必须进行编号. 超时计时器的重传时间应当比数 ...

  9. 洛谷——P1023 税收与补贴问题

    P1023 税收与补贴问题 题目背景 每样商品的价格越低,其销量就会相应增大.现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),并假设相邻价位间销量的变化是线性的且在价格高于给定的最 ...

  10. (三)宏 __cplusplus C/C++混合编程

    前面一些篇目的内容作为一个在校生,很少用到,可能工作的人会见得多一点,但是第一次整体性的学习还是不希望有落下的东西,虽然不常用但至少要有个印象 那么就进入第三篇<宏 __cplusplus> ...