Hibernate中一级缓存概念以及flush与clear的区别
Posted kuillldan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate中一级缓存概念以及flush与clear的区别相关的知识,希望对你有一定的参考价值。
Hibernate采用缓存机制提高数据查询效率。缓存分为一级缓存和二级缓存,一级缓存在Session中存在,二级缓存需要手动配置。
在一级缓存中,如果数据保存到数据库中后,而session又没有关闭的话,那么这些数据会放到缓存中,再次发出查询请求,Hibernate首先检查缓存中是否有该数据,如果找到该数据,那么就不会向数据库发起查询请求而是直接将缓存中的数据取出。请看下面的例子:
public class Main { public static void main(String[] args) throws Exception { Member member = (Member)HibernateSessionFactory.getSession().get(Member.class, 7); System.out.println(member); Member member1 = (Member)HibernateSessionFactory.getSession().get(Member.class, 7); System.out.println(member1); } }
上面的代码实际上只向数据库发起了一次查询请求:
Hibernate: select member0_.mid as mid0_0_, member0_.age as age0_0_, member0_.birthday as birthday0_0_, member0_.name as name0_0_, member0_.note as note0_0_, member0_.salary as salary0_0_ from hedb.member member0_ where member0_.mid=? Member [mid=7, age=22, birthday=2017-01-10, name=admin, note=Good person!, salary=22.22] Member [mid=7, age=22, birthday=2017-01-10, name=admin, note=Good person!, salary=22.22]
这样的机制会大大提高查询效率。
但是!如果说现在要求你批量保存100000行记录呢?按照此时的道理来讲,这100000行记录都要缓存起来,这样明显会造成一个非常危险的举动,所以在进行实际的开发过程之中,必须要考虑数据的分批处理。
请看下面的代码:
1 public static void main(String[] args) throws Exception 2 { 3 for (int x = 100; x < 10000; x++) 4 { 5 Member vo = new Member(); 6 vo.setName("你好"); 7 vo.setAge(20); 8 vo.setSalary(1000.0); 9 vo.setBirthday(new Date()); 10 HibernateSessionFactory.getSession().save(vo); 11 if (x % 10 == 0) 12 { 13 // 每10条记录进行一次缓冲区的刷新 14 HibernateSessionFactory.getSession().flush(); 15 HibernateSessionFactory.getSession().clear(); 17 } 18 } 19 20 HibernateSessionFactory.getSession().beginTransaction().commit(); 21 }
上面用到了Session接口的flush()和clear()函数。
- flush()是将缓存中的所有数据全部提交到数据库中,也就是将缓存中暂未保存到数据库的数据保存到数据库中。
- clear()是将缓存全部清空。
以上是关于Hibernate中一级缓存概念以及flush与clear的区别的主要内容,如果未能解决你的问题,请参考以下文章