`
wsql
  • 浏览: 11815249 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

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

    博文链接:https://llying.iteye.com/blog/221702

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

    主要介绍了Hibernate的Session_flush与隔离级别代码详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

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

    1 session.flush()的作用就是将session的缓存中的数据与数据库同步。 2 session.clear()的作用就是清除session中的缓存数据(不管缓存与数据库的同步)。 3.session.refresh():会强制发送select语句,以使session...

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

    关于在使用 hibernate 在提交事务时常遇到的异常: ...其实这个异常一般都是和我们在操作session flush方法和提交事务过程中会抛出的,下面就具体结合session的事务和声明周期来具体分析下,为什么会有这样的异常;

    Hibernate+中文文档

    10.10. Session刷出(flush) 10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 ...

    hibernate操作数据库笔记

    Session对象.flush(); //将Session中的缓存内容提交到数据库 Session对象.clear(); //清空Session中的所有缓存(彻底清除会话) Session对象.beginTransaction().begin(); //开始一个事务 4.用Session对象的以下...

    hibernate基础教程

    在Hibernate中使用两极缓存结构,第一级缓存是Session级别的缓存,Session级别的缓存是由Hibernate管理的,一般情况下无需进行干预.第二级缓存是 SessionFactory级别的缓存,SessionFactory级的缓存可以进行配置和...

    hibernate3.2中文文档(chm格式)

    10.10. Session刷出(flush) 10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 ...

    hibernate学习笔记

    session flush测试(hibernate_session_flush) 12 hihernate一对多关联映射(单向Classes-----&gt;Student) 13 hihernate一对多关联映射(双向Classes&lt;-----&gt;Student)(常用) 14 hibernate一对多双向自连接关联映射...

    Hibernate学习笔记

    013 session_flush 014 一对多关联映射 单向 015 一对多关联映射 双向 016 多对多关联映射 单向 017 多对多关联映射 双向 018 关联映射文件中标签中的 lazy(懒加载)属性 019 关联映射文件中集合标签中的 lazy(懒加载...

    Hibernate中文详细学习文档

    10.10. Session刷出(flush) 10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 ...

    Hibernate 中文 html 帮助文档

    10.10. Session刷出(flush) 10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 11.1.3. ...

    Hibernate使用技巧汇总

    session.Flush() 强制数据库立即同步,当用事务时,不必用flush,事务提交自动调用flush 在session关闭时也会调用flush &lt;br&gt;4. Hibernate总是使用对象类型作为字段类型 5. XDoclet专门建立了...

    HibernateAPI中文版.chm

    10.10. Session刷出(flush) 10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 ...

    Hibernate中get和load方法的区别以及close(),clear()、evict()等的区别

    Hibernate Session中的 flush方法的作用 get和load方式是根据id取得一个记录 下边详细说一下get和load的不同,因为有些时候为了对比也会把find加进来。 1.从返回结果上对比: load方式检索不到的话会抛出org....

    Hibernate查询语言

    14.1. 批量插入(Batch inserts) 如果要将很多对象持久化,你必须通过经常的调用 flush() 以及稍后调用 ...session.flush(); session.clear(); } } tx.commit(); session.close(); 14.2. 批量更新(Batch updates)

    hibernate 教程

    同步(Flush) Session 9.7.2. 提交数据库事务 9.7.3. 关闭Session 9.7.4. 处理异常 9.8. 生命周期和对象图(Lifecyles and object graphs) 9.9. 拦截器(Interceptors) 9.10. 元数据(Metadata) API...

    最全Hibernate 参考文档

    10.10. Session刷出(flush) 10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scopes) 11.1.1. 操作单元(Unit of work) 11.1.2. 应用程序事务...

    hibernate3.04中文文档.chm

    11.10. Session刷出(flush) 11.11. 传播性持久化(transitive persistence) 11.12. 使用元数据 12. 事务和并发 12.1. Session和事务范围(transaction scopes) 12.1.1. 操作单元(Unit of work) 12.1.2. 应用程序...

    hibernate.properties

    #hibernate.transaction.flush_before_completion ## Enable automatic session close at the end of transaction ## (This setting is relevant with or without the Transaction API) #hibernate.transaction....

Global site tag (gtag.js) - Google Analytics