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. javaweb作业一

    作业:Http全称叫什么?有什么特点?端口号是多少?超文本传输协议:(1)遵循请求/响应模型(2)http协议是一种无状态协议,请求/响应完成后,连接会断开.这时,服务器无法知道当前访问的用户是否是老 ...

  2. 20155225 2016-2017-2 《Java程序设计》第十周学习总结

    20155225 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 22章网络 22.1网络概览 22.2超文本传输协议(HTTP) 22.2.1 HTTP请求 ...

  3. centos7 vnc 无法systemctl启动

    1.centos7 vnc 无法systemctl启动 报错如下:Failed to start Remote desktop service (VNC) 2.解决办法 错误服务脚本名 vncserv ...

  4. Windows 10利用自带的 Hyper-v 安装Linux

    Linux由于其众多独特的优势(可参见Linux系统的优势),而被很多人所喜爱.而要使用Linux那首先要做的工作就是安装Linux系统了.这里给出在 win10 下利用虚拟机 Hyper-v 安装 ...

  5. Ansible介绍及安装部署

    本节内容: 运维工具 Ansible特性 Ansible架构图和核心组件 安装Ansible 演示使用示例 一.运维工具 作为一个Linux运维人员,需要了解大量的运维工具,并熟知这些工具的差异,能够 ...

  6. CCF CSP 201709-2 公共钥匙盒

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-2 公共钥匙盒 问题描述 有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须 ...

  7. day6 SYS模块

        SYS模块 用于提供对Python解释器相关的操作: (1)sys.argv           命令行参数List,第一个元素是程序本身路径 >>> sys.argv [' ...

  8. 在ASP.NET Web API和ASP.NET Web MVC中使用Ninject

    先附上源码下载地址 一.准备工作 1.新建一个名为MvcDemo的空解决方案 2.新建一个名为MvcDemo.WebUI的空MVC应用程序 3.使用NuGet安装Ninject库   二.在ASP.N ...

  9. 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:fhcq-oa' did not find a matching property.

    当你在使用Eclipse运行web项目时,你可能会看到控制台出现: 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Settin ...

  10. PHP 中文字符串相关

    1.字符串长度 中文字符串使用strlen() 获取字符串长度时一个UTF8的中文字符是3个字节长度:使用mb_strlen(),选定内码为UTF8,则会将一个中文字符当作长度1来计算 在对含中文字符 ...