- 浏览: 233180 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
operating...mydream:
mcreturn 写道我是按你这么配置的 做均衡测试的测试的 ...
Apache + Tomcat集群配置详解 -
u011938035:
谢谢。
第四章:小朱笔记hadoop之源码分析-conf分析 -
slipper-jay:
ssh无密码登陆失败Slave执行$chmod 700 ~/. ...
第一章:小朱笔记hadoop之环境配置以及集群部署-集群环境配置 -
slipper-jay:
文思敏捷,才华横溢 老大!
第一章:小朱笔记hadoop之环境配置以及集群部署-集群环境配置 -
huashuizhuhui:
dacoolbaby 写道楼主最后一段是在推销自己吗?哈~~ ...
小朱笔记之hadoop应用实战、源码分析-目录
1.Clear 方法
无论是Load 还是 Get 都会首先查找缓存(一级缓存) 如果没有,才会去数据库查找,调用Clear() 方法,可以强制清除Session缓存。
例:
view plaincopy to clipboardprint?
1. public void testClear(){
2. Session session = HibernateUitl.getSessionFactory().getCurrentSession();
3. session.beginTransaction();
4. Teacher t = (Teacher) session.get(Teacher.class, 3);
5. System.out.println(t.getName());
6. Teacher t2 = (Teacher) session.get(Teacher.class, 3);
7. System.out.println(t2.getName());
8. session.getTransaction().commit();
9. }
这里虽然用了2 个 get 方法( get 方法会立即执行 sql 语句),但因为第一次执行了会缓存一个 ID 为 3 的实体,所以虽然有 2 个 get 方法只执行一次 SQL 语句。
view plaincopy to clipboardprint?
1. public void testClear(){
2. Session session = HibernateUitl.getSessionFactory().getCurrentSession();
3. session.beginTransaction();
4. Teacher t = (Teacher) session.get(Teacher.class, 3);
5. System.out.println(t.getName());
6. session.clear();//这里不clear只会执行一次sql语句,有clear会执行2次
7. Teacher t2 = (Teacher) session.get(Teacher.class, 3);
8. System.out.println(t2.getName());
9. session.getTransaction().commit();
10. }
这里在第2 次 get 前执行 session.clear(), 我们把 hibernate show_sql 出来,它就会执行 2 次 sql 语句了。 所以session.clear() 会清除缓存。
2.Flush方法
可以强制进行从内存到数据库的同步。
例:
view plaincopy to clipboardprint?
1. @Test
2. /**
3. * flush 强制与数据库同步
4. */
5. public void testFlush(){
6. Session session = HibernateUitl.getSessionFactory().getCurrentSession();
7. session.beginTransaction();
8. Teacher t = (Teacher) session.get(Teacher.class, 3);
9. t.setName("yyy");
10.
11. t.setName("yyyyy");
12. session.getTransaction().commit();
13. }
看这段代码,我们setName() 2 次, 但程序只会更改数据库一次,在 commit 时。
view plaincopy to clipboardprint?
1. @Test
2. /**
3. * flush 强制与数据库同步
4. */
5. public void testFlush(){
6. Session session = HibernateUitl.getSessionFactory().getCurrentSession();
7. session.beginTransaction();
8. Teacher t = (Teacher) session.get(Teacher.class, 3);
9. t.setName("yyy");
10. session.flush();//有flush会执行2次UPDAE,没有会只执行一次
11. t.setName("yyyyy");
12. session.getTransaction().commit();
13. }
我们在第2 次 setName ()时 执行 session.flush().
再看hibernate 执行的 sql 语句
view plaincopy to clipboardprint?
1. Hibernate:
2. update
3. Teacher
4. set
5. birthday=?,
6. name=?,
7. title=?
8. where
9. id=?
10. Hibernate:
11. update
12. Teacher
13. set
14. birthday=?,
15. name=?,
16. title=?
17. where
18. id=?
执行了2 次 Update
所以看出来flush 方法会强制与数据库同步。
Flush方法是可以设置的,也就是 fulsh 什么时候执行是可以设置的
在session.beginTransaction 前设置 FlushMode
session.setFlushMode(FlushMode.Always|AUTO|COMMIT|NEVER|MANUAL)
FlushMode有 5 个值可选
Always:任何代码都会 Flush
AUTO:默认方式 – 自动
Commit:COMMIT时
Never:始终不
MANUAL:手动方式
设置FlushMode 有个好处是可以节省开销,比如默认 session 只做查询时,就可以不让他与数据库同步了。
session.evict(obj) :会把指定的缓冲对象进行清除。
session.clear() :把缓冲区内的全部对象清除,但不包括操作中的对象。
Hibernate 执行的顺序如下:
(1) 生成一个事务的对象,并标记当前的 Session 处于事务状态(注:此时并未启动数据库级事务)。
(2) 应用使用 s.save 保存对象,这个时候 Session 将这个对象放入 entityEntries ,用来标记对象已经和当前的会话建立了关联,由于应用对对象做了保存的操作, Session 还要在 insertions 中登记应用的这个插入行为(行为包括:对象引用、对象 id 、 Session 、持久化处理类)。
(3)s.evict 将对象从 s 会话中拆离,这时 s 会从 entityEntries 中将这个对象移出。
(4) 事务提交,需要将所有缓存 flush 入数据库, Session 启动一个事务,并按照 insert,update,……,delete 的顺序提交所有之前登记的操作(注意:所有 insert 执行完毕后才会执行 update ,这里的特殊处理也可能会将你的程序搞得一团糟,如需要控制操作的执行顺序,要善于使用 flush ),现在对象不在 entityEntries 中,但在执行 insert 的行为时只需要访问 insertions 就足够了,所以此时不会有任何的异常。异常出现在插入后通知 Session 该对象已经插入完毕这个步骤上,这个步骤中需要将 entityEntries 中对象的 existsInDatabase 标志置为 true ,由于对象并不存在于 entityEntries 中,此时 Hibernate 就认为 insertions 和 entityEntries 可能因为线程安全的问题产生了不同步(也不知道 Hibernate 的开发者是否考虑到例子中的处理方式,如果没有的话,这也许算是一个 bug 吧),于是一个 net.sf.hibernate.AssertionFailure 就被抛出,程序终止。
一般我们会错误的认为 s.save 会立即执行,而将对象过早的与 Session 拆离,造成了 Session 的 insertions 和 entityEntries 中内容的不同步。所以我们在做此类操作时一定要清楚 Hibernate 什么时候会将数据 flush 入数据库,在未 flush 之前不要将已进行操作的对象从 Session 上拆离。解决办法是在 save 之后,添加 session.flush 。
无论是Load 还是 Get 都会首先查找缓存(一级缓存) 如果没有,才会去数据库查找,调用Clear() 方法,可以强制清除Session缓存。
例:
view plaincopy to clipboardprint?
1. public void testClear(){
2. Session session = HibernateUitl.getSessionFactory().getCurrentSession();
3. session.beginTransaction();
4. Teacher t = (Teacher) session.get(Teacher.class, 3);
5. System.out.println(t.getName());
6. Teacher t2 = (Teacher) session.get(Teacher.class, 3);
7. System.out.println(t2.getName());
8. session.getTransaction().commit();
9. }
这里虽然用了2 个 get 方法( get 方法会立即执行 sql 语句),但因为第一次执行了会缓存一个 ID 为 3 的实体,所以虽然有 2 个 get 方法只执行一次 SQL 语句。
view plaincopy to clipboardprint?
1. public void testClear(){
2. Session session = HibernateUitl.getSessionFactory().getCurrentSession();
3. session.beginTransaction();
4. Teacher t = (Teacher) session.get(Teacher.class, 3);
5. System.out.println(t.getName());
6. session.clear();//这里不clear只会执行一次sql语句,有clear会执行2次
7. Teacher t2 = (Teacher) session.get(Teacher.class, 3);
8. System.out.println(t2.getName());
9. session.getTransaction().commit();
10. }
这里在第2 次 get 前执行 session.clear(), 我们把 hibernate show_sql 出来,它就会执行 2 次 sql 语句了。 所以session.clear() 会清除缓存。
2.Flush方法
可以强制进行从内存到数据库的同步。
例:
view plaincopy to clipboardprint?
1. @Test
2. /**
3. * flush 强制与数据库同步
4. */
5. public void testFlush(){
6. Session session = HibernateUitl.getSessionFactory().getCurrentSession();
7. session.beginTransaction();
8. Teacher t = (Teacher) session.get(Teacher.class, 3);
9. t.setName("yyy");
10.
11. t.setName("yyyyy");
12. session.getTransaction().commit();
13. }
看这段代码,我们setName() 2 次, 但程序只会更改数据库一次,在 commit 时。
view plaincopy to clipboardprint?
1. @Test
2. /**
3. * flush 强制与数据库同步
4. */
5. public void testFlush(){
6. Session session = HibernateUitl.getSessionFactory().getCurrentSession();
7. session.beginTransaction();
8. Teacher t = (Teacher) session.get(Teacher.class, 3);
9. t.setName("yyy");
10. session.flush();//有flush会执行2次UPDAE,没有会只执行一次
11. t.setName("yyyyy");
12. session.getTransaction().commit();
13. }
我们在第2 次 setName ()时 执行 session.flush().
再看hibernate 执行的 sql 语句
view plaincopy to clipboardprint?
1. Hibernate:
2. update
3. Teacher
4. set
5. birthday=?,
6. name=?,
7. title=?
8. where
9. id=?
10. Hibernate:
11. update
12. Teacher
13. set
14. birthday=?,
15. name=?,
16. title=?
17. where
18. id=?
执行了2 次 Update
所以看出来flush 方法会强制与数据库同步。
Flush方法是可以设置的,也就是 fulsh 什么时候执行是可以设置的
在session.beginTransaction 前设置 FlushMode
session.setFlushMode(FlushMode.Always|AUTO|COMMIT|NEVER|MANUAL)
FlushMode有 5 个值可选
Always:任何代码都会 Flush
AUTO:默认方式 – 自动
Commit:COMMIT时
Never:始终不
MANUAL:手动方式
设置FlushMode 有个好处是可以节省开销,比如默认 session 只做查询时,就可以不让他与数据库同步了。
session.evict(obj) :会把指定的缓冲对象进行清除。
session.clear() :把缓冲区内的全部对象清除,但不包括操作中的对象。
Hibernate 执行的顺序如下:
(1) 生成一个事务的对象,并标记当前的 Session 处于事务状态(注:此时并未启动数据库级事务)。
(2) 应用使用 s.save 保存对象,这个时候 Session 将这个对象放入 entityEntries ,用来标记对象已经和当前的会话建立了关联,由于应用对对象做了保存的操作, Session 还要在 insertions 中登记应用的这个插入行为(行为包括:对象引用、对象 id 、 Session 、持久化处理类)。
(3)s.evict 将对象从 s 会话中拆离,这时 s 会从 entityEntries 中将这个对象移出。
(4) 事务提交,需要将所有缓存 flush 入数据库, Session 启动一个事务,并按照 insert,update,……,delete 的顺序提交所有之前登记的操作(注意:所有 insert 执行完毕后才会执行 update ,这里的特殊处理也可能会将你的程序搞得一团糟,如需要控制操作的执行顺序,要善于使用 flush ),现在对象不在 entityEntries 中,但在执行 insert 的行为时只需要访问 insertions 就足够了,所以此时不会有任何的异常。异常出现在插入后通知 Session 该对象已经插入完毕这个步骤上,这个步骤中需要将 entityEntries 中对象的 existsInDatabase 标志置为 true ,由于对象并不存在于 entityEntries 中,此时 Hibernate 就认为 insertions 和 entityEntries 可能因为线程安全的问题产生了不同步(也不知道 Hibernate 的开发者是否考虑到例子中的处理方式,如果没有的话,这也许算是一个 bug 吧),于是一个 net.sf.hibernate.AssertionFailure 就被抛出,程序终止。
一般我们会错误的认为 s.save 会立即执行,而将对象过早的与 Session 拆离,造成了 Session 的 insertions 和 entityEntries 中内容的不同步。所以我们在做此类操作时一定要清楚 Hibernate 什么时候会将数据 flush 入数据库,在未 flush 之前不要将已进行操作的对象从 Session 上拆离。解决办法是在 save 之后,添加 session.flush 。
发表评论
-
Hibernate_JPA
2012-03-08 10:03 930Hibernate_JPA -
hibernate3.1_ref_chinese(中文版)
2012-03-08 10:01 919hibernate3.1_ref_chinese(中文版) -
什么叫n+1次select查询问题?
2011-04-05 18:13 2125什么叫n+1次select查询问 ... -
Hibernate性能优化4
2011-04-05 18:10 10541) 在处理大数据量时, ... -
Hibernate性能优化5
2011-04-05 18:09 903在处理大数据量时,会 ... -
Hibernate性能优化3
2011-04-05 18:08 1269一。 inverse = ? invers ... -
Hibernate性能优化2
2011-04-05 18:08 828本文依照HIBERNATE帮助文档,一些网络书籍及项目经验整理 ... -
Hibernate性能优化1
2011-04-05 18:07 1063有很多人认为Hibernate天生效率比较低,确实,在普遍情况 ... -
Hibernate缓存深入详解[贵在深入]
2011-04-05 11:46 3092Hibernate缓存深入详解 ,有兴趣可以看看 孙卫琴的hi ... -
Hibernate缓存深入详解[贵在深入]
2011-04-05 11:46 819Hibernate缓存深入详解[这是我见到过将缓存讲的最透彻的 ... -
Hibernate中的数据检索策略概述
2011-04-02 22:06 646关键字: hibernate 数据检索策略 我们知道,Hibe ... -
Hibernate中的对象的状态
2011-04-02 22:05 464Hibernate中的对象有三种状态:瞬时(Transient ... -
Hibernate中的ThreadLocal类
2011-04-02 22:05 1062我们知道,Session是Hibernate运行的核心,通过它 ... -
Hibernate中的Session缓存
2011-04-02 22:04 889Hibernate中又两种缓存:一级缓存和二级缓存。 下面我们 ... -
Hibernate中的Session的保存删除和更新
2011-04-02 22:04 1314对于持久化类,我们可 ... -
Hibernate中的Query接口学习
2011-04-02 22:03 928在Hibernate 2.x中,可以用find()方法来执行H ... -
Hibernate中的Configuration类
2011-04-02 22:03 877Configuration类用来管理我们的配置文件的信息的,通 ... -
Hibernate和Jpa中都有持久化上下文
2011-04-02 22:02 1565Hibernate和Jpa中都有持久 ... -
Hibernate深入探讨
2011-04-02 22:02 973Hibernate 缓存策略 一级 ... -
Hibernate批量更新与删除实例浅析
2011-04-02 22:01 906在我们的Java项目中,批量更新是指在一个事务中更新大批量数据 ...
相关推荐
主要讲解hibernate中flush()和evict()的用处
Hibernate Session中的 flush方法的作用 get和load方式是根据id取得一个记录 下边详细说一下get和load的不同,因为有些时候为了对比也会把find加进来。 1.从返回结果上对比: load方式检索不到的话会抛出org....
对hibernate的flush机制有兴趣可以看看
NULL 博文链接:https://wuhaidong.iteye.com/blog/766562
session.flush()和session.clear()就针对session的一级缓存的处理。 简单的说, 1 session.flush()的作用就是将session的缓存中的数据与数据库同步。 2 session.clear()的作用就是清除session中的缓存数据(不管缓存...
博文链接:https://llying.iteye.com/blog/221702
关于在使用 hibernate 在提交事务时常遇到的异常: ...其实这个异常一般都是和我们在操作session flush方法和提交事务过程中会抛出的,下面就具体结合session的事务和声明周期来具体分析下,为什么会有这样的异常;
主要介绍了Hibernate的Session_flush与隔离级别代码详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
主要介绍了深入理解Hibernate中的flush机制,本文是对flush机制深入研究得出的一些结论总结,需要的朋友可以参考下
//该方法将到classpath下解析hibernate.cfg.xml中的配置,如果不用Hibernate默认的配置文件名和路径,可在该方法中指定Hibernate配置文件的名称和路径 2.用Configuration对象获取SessionFactory和Session对象:...
What is hibernate Why hibernate How to build a sample The 3 states of PO What hide behind the operation Flush and clear Cache Associations Annotation
主要介绍了Java语言中flush函数作用及使用方法详解,具有一定借鉴价值,需要的朋友可以参考下
3、批量存储:session.flush()和session.clear() 二 Hibernate中的二级缓存结构 在Hibernate中使用两极缓存结构,第一级缓存是Session级别的缓存,Session级别的缓存是由Hibernate...
实现一个默认的(即无参数的)构造方法(constructor) 5.1.3. 提供一个标识属性(identifier property)(可选) 5.1.4. 使用非final的类 (可选) 5.2. 实现继承(Inheritance) 5.3. 实现equals()和hashCode...
013 session_flush 014 一对多关联映射 单向 015 一对多关联映射 双向 016 多对多关联映射 单向 017 多对多关联映射 双向 018 关联映射文件中标签中的 lazy(懒加载)属性 019 关联映射文件中集合标签中的 lazy(懒加载...
4.1.1. 实现一个默认的(即无参数的)构造方法(constructor) 4.1.2. 提供一个标识属性(identifier property)(可选) 4.1.3. 使用非final的类 (可选) 4.1.4. 为持久化字段声明访问器(accessors)和是否可变的...
session flush测试(hibernate_session_flush) 12 hihernate一对多关联映射(单向Classes----->Student) 13 hihernate一对多关联映射(双向Classes<----->Student)(常用) 14 hibernate一对多双向自连接关联映射...
有关php的ob_flush()与flush()使用方法 注意:ob_flush()和flush()这两个函数一般要一起使用,顺序是先ob_flush(),然后flush(),它们的作用是刷新缓冲区。这里具体的说下什么时候要用到刷新缓冲区和为什么要刷新...
下面小编就为大家带来一篇innodb_flush_method取值方法(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
HibernateTemplate对Hibernate Session操作进行了封装,而 HibernateTemplate.execute方法则是一封装机制的核心 *在spring的配置文件里,移植了整个hibernate.cfg.xml的内容。