`
bulote
  • 浏览: 1353969 次
文章分类
社区版块
存档分类
最新评论

Hibernate的session中的flush

 
阅读更多

什么是Hibernate Session刷出(flush)?也许大家对此不够了解,但相信你看完本文一定有很大的收益。

每间隔一段时间,Session会执行一些必需的SQL语句来把内存中的对象的状态同步到JDBC连接中。这个过程被称为Hibernate Session刷出(flush)。

<wbr></wbr>

默认会在下面的时间点执行:

<wbr></wbr>

◆在某些查询执行之前

◆在调用org.hibernate.Transaction.commit()的时候

◆在调用Session.flush()的时候

◆涉及的SQL语句会按照下面的顺序发出执行:

◆所有对实体进行插入的语句,其顺序按照对象执行Session.save()的时间顺序

◆所有对实体进行更新的语句

◆所有进行集合删除的语句

◆所有对集合元素进行删除,更新或者插入的语句

◆所有进行集合插入的语句

◆所有对实体进行删除的语句,其顺序按照对象执行Session.delete()的时间顺序

(有一个例外是,如果对象使用native方式来生成ID(持久化标识)的话,它们一执行save就会被插入。)

<wbr></wbr>

除非你明确地发出了flush()指令,关于Session何时会执行这些JDBC调用是完全无法保证的,只能保证它们执行的前后顺序。 当然,Hibernate保证,Query.list(..)绝对不会返回已经失效的数据,也不会返回错误数据。

<wbr></wbr>

也可以改变默认的设置,来让Hibernate Session刷出(flush)操作发生的不那么频繁。 FlushMode类定义了三种不同的方式。仅在提交时刷出(仅当Hibernate的Transaction API被使用时有效), 按照刚才说的方式刷出,以及除非明确使用flush()否则从不刷出。最后一种模式对于那些需要长时间保持Session为打开或者断线状态的长时间运行的工作单元很有用。

<wbr></wbr>

sess = sf.openSession();<wbr><br> Transaction tx = sess.beginTransaction();</wbr>

<wbr></wbr>

// allow queries to return stale state<wbr><wbr><br> sess.setFlushMode(FlushMode.COMMIT);<wbr><wbr><br> Cat izi = (Cat) sess.load(Cat.class, id);<wbr><br> izi.setName(iznizi);<wbr><br><wbr><br> // might return stale data<wbr><br> sess.find("from Cat as cat left outer join cat.kittens kitten");<wbr><br><wbr><br> // change to izi is not flushed!</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

tx.commit(); // flush occurs<wbr></wbr>

sess.close();

<wbr></wbr>

Hibernate Session刷出(flush)期间,可能会抛出异常。(例如一个DML操作违反了约束)异常处理涉及到对Hibernate事务性行为的理解,这里在事务和并发中有具体的介绍,这里我们就不加以介绍了。

<wbr></wbr>

还有一种情况很值得我们注意——插入大量数据的时候

例如,我现在要插入10000个User,咋办?

很多人会想这样:

Transaction tx = session.beginTransaction();

for(int i=0;i<10000;i++)

{

<wbr><wbr><wbr> User u = new User(......);</wbr></wbr></wbr>

<wbr><wbr><wbr> session.save(u);</wbr></wbr></wbr>

}

tx.commit();

session.close();

<wbr></wbr>

但随着程序的运行,总会在某一个时间点失败。并且抛出OutOfMemoryException(内存溢出)异常!

这是因为Hibernate的session持有一个必选的一级缓存,所有的User实例都将在session级别的缓存区进行缓存。但缓存区“装不下了”。

<wbr></wbr>

那么如何解决?

解决方案:定时将session的缓存刷入数据库!

for(int i=0;i<10000;i++)

{

<wbr><wbr><wbr> User u = new User(......);</wbr></wbr></wbr>

<wbr><wbr><wbr> session.save(u);</wbr></wbr></wbr>

<wbr><wbr><wbr> for(i ==0)</wbr></wbr></wbr>

<wbr><wbr><wbr> {</wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr> session.flush();</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr> session.close();</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr> }</wbr></wbr></wbr>

}

tx.commit();

session.close();

<wbr></wbr>

参考地址:http://developer.51cto.com/art/200909/153860.htm

分享到:
评论

相关推荐

    hibernate的session.flush

    `Session.flush()`方法是一个关键的操作,它强制Hibernate将内存中的对象状态同步到数据库,确保数据的一致性。这篇博客深入探讨了`Session.flush()`的工作原理和应用场景。 `Session`在Hibernate中主要有以下职责...

    hibernate session生命周期示例

    在Hibernate中,事务和Session是紧密关联的,事务的边界通常定义了Session的工作范围。 3. **持久化操作**: - **加载和检索**:使用`get()`或`load()`方法可以加载一个实体,如果对象存在于数据库,Hibernate将...

    Hibernate_Session_Transaction

    在Java的持久化框架Hibernate中,`Session`和`Transaction`是两个至关重要的概念,它们在数据管理和事务处理中起到核心作用。这篇文章将深入解析这两个概念及其相关知识点。 `Session`是Hibernate提供的一种与...

    hibernate的flush机制

    4. **关闭Session**:当Session被关闭时,Hibernate会自动执行Flush操作,以确保所有未提交的更改都被持久化到数据库中。 #### 错误示例分析 在给定的部分内容中,提到了一个典型的错误场景,其中包含了一个常见的...

    hibernate_flush 深入了解

    Flush是Hibernate将内存中的对象状态同步到数据库的过程。当Session中的对象被修改、新增或删除后,这些变更不会立即写入数据库,而是先保存在Session缓存中。当达到特定条件或手动调用`Session.flush()`时,...

    hibernate session详细方法,值得珍藏

    ### Hibernate Session 详解:值得珍藏的深度解析 在Java持久化领域,Hibernate无疑占据了举足轻重的地位,而`Hibernate Session`则是其中的核心组件之一,它提供了与数据库交互的主要接口,是对象/关系映射(ORM)...

    hibernate的flush()、refresh()、clear()针对一级缓存的操作的区别.docx

    在Java的Hibernate框架中,一级缓存是Session对象内置的缓存机制,它的存在是为了优化数据库操作,减少对数据库的直接访问,从而提高应用程序的性能。一级缓存的生命周期与Session对象相同,也就是说,只要Session...

    Hibernate的Session_flush与隔离级别代码详解

    Session_flush 是 Hibernate 中的一种机制,用于控制当前 Session 中的对象何时被 flush 到数据库中。flush 操作可以将 Session 中的变化同步到数据库中,从而保持数据的一致性。 隔离级别是数据库事务中的一个概念...

    HIbernate Session 详解

    #### 一、Session在Hibernate中的地位及作用 在Hibernate框架中,`Session` 是一个非常核心且重要的组件。作为Hibernate提供的主要操作数据库的接口,`Session` 不仅承担着保存、更新、删除数据的任务,还负责执行...

    Hibernate Session 4种对象状态.docx

    当Session执行flush操作时,会将缓存中的对象变更同步到数据库,发送对应的INSERT语句。例如,测试中的`session.save(news)`会使对象变为持久化状态。 3. **游离状态(Detached State)**: 如果一个持久化对象的...

    Hibernate的事务处理机制和flush方法的用法.docx

    在本文中,我们将深入探讨Hibernate的事务处理机制以及`flush`方法的用法,并分析为何在某些场景下会出现特定的异常。 首先,我们需要了解Hibernate中的事务处理。在Java应用中,事务通常与SessionFactory和Session...

    hibernate--3.Hibernate数据持久化(通过 Session 操纵对象)

    当我们在Session上进行操作时,这些操作不会立即反映到数据库中,而是被缓存起来,直到调用`flush()`方法或者事务提交时才会真正执行。 在开始使用Session之前,需要配置Hibernate的环境,包括创建SessionFactory,...

    深入理解Hibernate中的flush机制

    - `session.createSQLQuery(sql).uniqueResult()`能直接查询到数据,是因为Hibernate在执行查询前会先flush,所以即使事务未提交,查询也是基于已flush的数据进行的,相当于查看了缓存中的状态。 4. **缓存与查询*...

    hibernate的核心接口--Session

    - **定义**: Session 是 Hibernate 框架中最常用的接口之一,它又被称为持久化管理器。Session 负责所有与数据库交互的工作,包括管理持久化对象的生命周期,并通过提供第一级别的高级缓存来确保持久化对象的数据与...

    hibernate关于session的关闭实例解析

    关于 Hibernate 中 Session 的关闭实例解析 Hibernate 是一个流行的 Java 持久层框架,它提供了许多强大功能来管理数据库交互。Session 是 Hibernate 中的一种基本概念,它扮演着关键角色来管理数据库交互。本文将...

    hibernate5--2.数据持久化及事务

    - 使用`Session.flush()`显式触发脏检查,如果发现异常,事务也会回滚。 通过以上内容,我们了解了Hibernate 5在数据持久化和事务管理方面的基本操作和注意事项。在实际项目中,结合事务的隔离级别、锁机制以及适当...

    Hibernate中大量数据的更新

    Hibernate 的一级缓存是指 Session 对象中缓存的所有对象。在批量更新时,如果不及时清除一级缓存,可能会导致内存溢出异常。因此,在批量更新时,需要定期调用 `session.flush()` 和 `session.clear()` 来清除一级...

    Hibernate官方中文参考手册下载

    批量操作如批处理更新和删除可以提高性能,例如`Session.flush()`和`Session.clear()`方法用于控制批处理的界限。 **12. 高级特性** 包括懒加载(Lazy Loading)、集合的分页查询、子查询、连接查询、联合查询、一...

    Hibernate code

    根据提供的文件信息,我们可以深入探讨Hibernate中的几个关键概念与操作,包括`Session.flush()`方法的使用、不同主键生成策略下的保存操作等。 ### Hibernate Session.flush() 方法详解 #### 一、基本概念 在...

    Hibernate下数据批量处理解决方案

    在Java开发中,尤其是涉及到大数据量的处理时,人们往往会质疑ORM框架,如Hibernate,是否适合进行批量数据操作。然而,实际上,通过适当的技术手段,我们可以有效地解决Hibernate在批量处理时可能出现的性能问题。...

Global site tag (gtag.js) - Google Analytics