【hibernate框架】核心开发接口-Clear方法与flush方法
2015-02-02 16:46
429 查看
1.Clear方法:无论是load还是get,都会首先查找缓存(一级缓存),如果没有,才会去数据库查找,调用clear()方法可以强制清除session缓存。
示例:
2.flush方法:可以强制进行从内存到数据库的同步!
示例:
flush方法的补充(不重要):flush是在什么时间去进行数据库的同步的?也就是怎么利用flush。
有session.setFlushMode(FlushMode.XXX);
这里的XXX有:ALWAYS(不论执行任何语句都会Flush)、AUTO(自动Flush,默认的状态)、COMMIT(提交的时候Flush)、MANUAL(手动的Flush)、NEVER(永远不Flush)。
搞这些的用处就是,在调节性能的时候会用。比如说我们现在拿出的结果集只是读,那就没有必要Flush了,可以设为ALWAYS。
但是FlushMode模式很少用到。
find相当于select,去取出对象,但是已经过时。
转载请注明出处:http://blog.csdn.net/acmman
示例:
public void testClear(){ Configuration cfg=new AnnotationConfiguration(); SessionFactory sf=cfg.configure().buildSessionFactory(); Session session=sf.openSession(); session.beginTransaction(); Teacher teacher=(Teacher)session.load(Teacher.class, 1); System.out.println(teacher.getName()+" "+teacher.getTitle()); //session.clear();//加了就清除缓存 Teacher teacher2=(Teacher)session.load(Teacher.class, 1); System.out.println(teacher2.getName()+" "+teacher2.getTitle()); session.getTransaction().commit(); session.close(); sf.close(); }根据Load只在请求时发出sql语句的原理,按理说hibernate应该发出两条语句,但是发现只发出来一条sql语句,原因就是get和load首先从缓存中查找信息,如果缓存中没有,才去数据库中查找信息。本例中ID号为1的属性在缓存中已经存在,Load无需再向数据库查询。如果在中间加clear方法,清除缓存中的信息,那就要发出两条sql去查询了。
2.flush方法:可以强制进行从内存到数据库的同步!
示例:
public void testFlush(){ Configuration cfg=new AnnotationConfiguration(); SessionFactory sf=cfg.configure().buildSessionFactory(); Session session=sf.openSession(); session.beginTransaction(); Teacher teacher=(Teacher)session.load(Teacher.class, 1); teacher.setZhicheng(ZhiCheng.B); //session.flush();//强制缓存中的内容与数据库同步 teacher.setZhicheng(ZhiCheng.C); System.out.println(teacher.getName()+" "+teacher.getTitle()); session.getTransaction().commit(); session.close(); sf.close(); }只发出来一条Sql语句,是在commit时发出的。你在commit之前就算改一百次,最后只是在commit才会跟新,原因是你一直在缓存里面修改,hibernate并没有在commit之前将缓存中的数据与数据库中的数据同步。加了flush方法之后,就会强制缓存中的内容与数据库同步。
flush方法的补充(不重要):flush是在什么时间去进行数据库的同步的?也就是怎么利用flush。
有session.setFlushMode(FlushMode.XXX);
这里的XXX有:ALWAYS(不论执行任何语句都会Flush)、AUTO(自动Flush,默认的状态)、COMMIT(提交的时候Flush)、MANUAL(手动的Flush)、NEVER(永远不Flush)。
搞这些的用处就是,在调节性能的时候会用。比如说我们现在拿出的结果集只是读,那就没有必要Flush了,可以设为ALWAYS。
但是FlushMode模式很少用到。
find相当于select,去取出对象,但是已经过时。
转载请注明出处:http://blog.csdn.net/acmman
相关文章推荐
- 【hibernate框架】核心开发接口-saveOrUpdate方法与delete方法
- 【hibernate框架】核心开发接口-load和get方法
- 【hibernate框架】核心开发接口-update方法
- Hibernate学习笔记(四)----核心开发接口、对象的三种状态、session常用方法
- hibernate框架中session缓存的flush(),commit(),refresh(),clear()方法
- 【hibernate框架】核心开发接口-Configuration接口
- Hibernate核心开发接口
- Hibernate的clear(),flush(),evict()方法详解
- hibernate常用核心开发接口
- hibernate---核心开发接口1(重点)
- Hibernate教程03_Hibernate核心开发接口介绍
- Hibernate Session中flush、clear、evict方法的区别
- Hibernate的clear(),flush(),evict()方法详解
- 框架学习之Hibernate 第三节 session接口以及get/load/persist方法
- Hibernate的clear(),flush(),evict()方法详解
- hibernate 核心开发接口
- HIbernate学习笔记(二) hibernate对象的三种状态与核心开发接口
- 【Hibernate框架开发之五】Hibernate对象的三种状态&&Session的常用方法
- Hibernate的clear(),flush(),evict()方法详解
- HIBERNATE核心开发接口介绍