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行记录都要缓存起来,这样明显会造成一个非常危险的举动,所以在进行实际的开发过程之中,必须要考虑数据的分批处理。

请看下面的代码:

     public static void main(String[] args) throws Exception
{
for (int x = 100; x < 10000; x++)
{
Member vo = new Member();
vo.setName("你好");
vo.setAge(20);
vo.setSalary(1000.0);
vo.setBirthday(new Date());
HibernateSessionFactory.getSession().save(vo);
if (x % 10 == 0)
{
// 每10条记录进行一次缓冲区的刷新
HibernateSessionFactory.getSession().flush();
HibernateSessionFactory.getSession().clear();
}
} HibernateSessionFactory.getSession().beginTransaction().commit();
}

上面用到了Session接口的flush()和clear()函数。

  • flush()是将缓存中的所有数据全部提交到数据库中,也就是将缓存中暂未保存到数据库的数据保存到数据库中。
  • clear()是将缓存全部清空。

最新文章

  1. C# Word生成PDF
  2. 十、DG
  3. Lucene.net站内搜索—6、站内搜索第二版
  4. 问题: Oracle Database 10g 未在当前操作系统中经过认证
  5. in addition to 和 except for
  6. Logcat 不显示日志的另一个原因. 跟cocos2dx关系不大.
  7. R Graphics Cookbook 第3章 – Bar Graphs
  8. Struts2体系结构图以及详解
  9. 【卷一】正则一 之re.split
  10. Python字符串之StringIO和struct
  11. VsCode+Node的前端环境搭建及其理解并创建一个前端目录
  12. Linux中more和less命令用法
  13. yagmail 实现发邮件
  14. SN Writer 写号工具使用
  15. 约瑟夫环简介,问题以及java实现
  16. 线程间的通信_多生产者多消费者问题_JDK1.5新特性_Lock
  17. 转:// 再说 Oracle RAC services
  18. Visual Studio 2015部署OpenCV
  19. 洛谷 p1352 没有上司的舞会 题解
  20. 代码重构:用工厂+策略模式优化过多的if else代码块

热门文章

  1. [Xamarin]我的Xamarin填坑之旅(一)
  2. 在Android中使用Protocol Buffers(上篇)
  3. 附2 volatile
  4. app开发技术调研
  5. Day 30 面向对象的考试题
  6. BZOJ 1003--[ZJOI2006]物流运输(最短路)
  7. 《JAVA与模式》之模板方法模式
  8. function参数
  9. redis升级注意事项
  10. 【xsy1097】 拼图 构造题