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. PHP array_diff 计算数组的差集

    array_diff (PHP 4 >= 4.0.1, PHP 5) array_diff — 计算数组的差集 说明 array array_diff ( array $array1 , arr ...

  2. 《精通Python设计模式》学习结构型之装饰器模式

    这只是实现了Python的装饰器模式. 其实,python的原生的装饰器的应用比这个要强,要广的. ''' known = {0:0, 1:1} def fibonacci(n): assert(n ...

  3. Kylin使用笔记-0: kylin介绍

    APACHE KYLIN™ 概览 Apache Kylin™是一个开源的分布式分析引擎,提供Hadoop之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由eBay Inc. 开发 ...

  4. 插头DP学习笔记——从入门到……????

    我们今天来学习插头DP??? BZOJ 2595:[Wc2008]游览计划 Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该 ...

  5. USACO 4.4 Pollutant Control (网络流求最小割割集)

    Pollutant ControlHal Burch It's your first day in Quality Control at Merry Milk Makers, and already ...

  6. 第一个iOS程序:Hello iOS

    今天我们来创建第一个iOS程序:Hello iOS!不需要写任何代码就能实现:

  7. 【基础知识】ASP.NET[基础二(aspx)]

    1.cs可以调用aspx中的runat=server控件,aspx中也可以访问测试中定义的字段.函数,还可以编写复杂的C#代码,for等所有C#代码都可以写在aspx中(不推荐这样写): 2.把代码写 ...

  8. AlertDialog对话框

    普通对话框 public void click1(View v) { //这里不能用 getApplicationContext()方法来获取上下文 AlertDialog.Builder build ...

  9. Python中 *args 和 **kwargs 的区别

    先来看个例子: def foo(*args, **kwargs): print 'args = ', args print 'kwargs = ', kwargs print '----------- ...

  10. JSTL介绍

    JSTL介绍 一.介绍 JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标 ...