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. 如何用纯CSS布局两列,一列固定宽度,另一列自适应?

    大家都知道好多网站都是左右布局的,很多公司在笔试和面试环节也常常问这个问题.一个去网易的师兄说14年腾讯面试的时候问过这个问题,网易在笔试和面试时候也问过这个问题,还有很多互联网公司也都涉及到这个问题 ...

  2. CVE-2010-3974 Microsoft Windows多个平台Fax Cover Page Editor内存破坏漏洞

    Microsoft Windows Fax Cover Pages用于个性化传真以及呈现更正式外观的传真传输.         Microsoft Windows XP SP2和SP3,Windows ...

  3. js中的Object.seal()与Object.freeze()

    关键字:seal, freeze, property descriptor. 1.Object.seal() 参考文档(2)中这样描述: The Object.seal() method seals ...

  4. centos下安装zabbix

    1. 安装mysql CREATE DATABASE zabbix;GRANT ALL ON zabbix.* TO 'zabbix'@'192.168.19.%' IDENTIFIED BY '12 ...

  5. day1作业:编写登陆接口

    作业一:编写登陆接口 1.输入用户名和密码 2.认证成功后显示欢迎信息 3.输错三次后锁定 思路:要求是编写登陆接口,那么要有一个存放用户信息的模块:三次后锁定,要有一个存放锁定用户信息的模块:我们知 ...

  6. win划分磁盘

    我的电脑-->管理 磁盘管理: 右键压缩卷 输入压缩空间量,进行压缩 右键未分配的磁盘-->新建逻辑卷 选取需要的格式

  7. js判断某年某月有多少天

    function getCountDays(ym) { var curDate = new Date(ym); /* 获取当前月份 */ var curMonth = curDate.getMonth ...

  8. 同步 Visual Studio Code 的设置与插件

    工具推荐:Settings Sync. 小心有坑! VS Code 没有账号系统,所以设置不能同步,在多终端使用时不是很方便. 有一款插件能做这个事情:Settings Sync - Visual S ...

  9. Laravel数据库配置问题

    由于项目需要,使用Laravel连接远程数据库进行开发 将默认的数据库配置信息改为远程数据库信息 在模型文件中定义了 protected $connection = 'default' 运行程序,报错 ...

  10. Python 中的函数

    学了 Python 中的数据类型,语句,接下来就来说一下 Python 中的函数,函数是结构化编程的核心.我们使用函数可以增加程序的可读性.自定义函数时使用关键字def 函数由多条语句组成.在定义函数 ...