Hibernate一级缓存
来源:互联网 发布:win7电脑桌面美化软件 编辑:程序博客网 时间:2024/05/17 21:40
1.什么是缓存?
不是指计算机中的cache缓存空间,在Hibernate中是指为了降低应用程序访问对数据库的访问次数,目的是提高应用程序获取数据的效率。
2.为什么使用缓存?
Hibernate框架访问数据库的效率直接影响应用程序的运行速度,因此优化Hibernate框架的执行效率对应用程序非常重要。
使用Hibernate缓存机制可以让程序更快的获取数据。
3.缓存的工作原理
将数据库中的一些数据copy到缓存中去,第二次获取数据时, 如果有缓存中有想要的数据直接取数据就是,无须使用 select语句从数据库中获取。如果缓存中没有想要的数据,Hibernate发出一条select语句从数据库中获取数据。
4.实例代码演示
package cn.codeWang.entity;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;@Entity(name="person")public class Person { @Id @GeneratedValue private int id; private String name; private String sex; private String department; public Person(){ } public Person(String name, String sex, String department) { super(); this.name = name; this.sex = sex; this.department = department; } public String getName() { return name; } public String getSex() { return sex; } public String getDepartment() { return department; }}
情况一:使用同一个session获取同一个对象
@Test public void testOneCache1(){ Person p=session.get(Person.class, 2); System.out.println("姓名="+p.getName()); Person p1=session.get(Person.class, 2); System.out.println("姓名="+p1.getName()); }控制台输出结果:Hibernate: alter table Employee add constraint FK14tijxqry9ml17nk86sqfp561 foreign key (department_id) references Department (id)Hibernate: select person0_.id as id1_2_0_, person0_.department as departme2_2_0_, person0_.name as name3_2_0_, person0_.sex as sex4_2_0_ from person person0_ where person0_.id=?姓名=凯耐姓名=凯耐总结:一个session对象第一次获得person对象,会将其放在缓存区域,第二次获得同一个对象时,直接从缓存中获取person对象即可。
情况二:使用不同session对象获取同一对象
@Test public void testOneCache1(){ Person p=session.get(Person.class, 2); System.out.println("姓名="+p.getName()); //第二次获得session对象 session = sessionFactory.openSession(); p=session.get(Person.class, 2); System.out.println("姓名="+p.getName()); }控制台输出结果:Hibernate: select person0_.id as id1_2_0_, person0_.department as departme2_2_0_, person0_.name as name3_2_0_, person0_.sex as sex4_2_0_ from person person0_ where person0_.id=?姓名=凯耐Hibernate: select person0_.id as id1_2_0_, person0_.department as departme2_2_0_, person0_.name as name3_2_0_, person0_.sex as sex4_2_0_ from person person0_ where person0_.id=?姓名=凯耐总结:使用不同session对象获取同一对象,需要对数据库进行两次select操作。因此缓存与session相关。
5.Hibernate一级缓存的API
一级缓存无法取消,使用两个方法管理。
- evict():将某个指定对象从session的一级缓存中清除。
- clear():清除一级缓存中的所有对象
6.session执行多次list()方法
@Test public void testOneCache1(){ Query query=session.createQuery("from person"); List<Person> list=query.list(); for(Person p:list){ System.out.println(p.getName()); } list=query.list(); for(Person p:list){ System.out.println(p.getName()); } }控制台输出结果:Hibernate: select person0_.id as id1_2_, person0_.department as departme2_2_, person0_.name as name3_2_, person0_.sex as sex4_2_ from person person0_凯耐凯丽欧陆Hibernate: select person0_.id as id1_2_, person0_.department as departme2_2_, person0_.name as name3_2_, person0_.sex as sex4_2_ from person person0_凯耐凯丽欧陆总结:同一个session执行两个相同的list()查询,list()方法不支持从缓存中获取数据,第二次查询仍然需要发出select语句去操作数据库。
- iterator()方法的查询使用
} @Test public void testOneCache1(){ Query query=session.createQuery("from person"); List<Person> list=query.list(); for(Person p:list){ System.out.println(p.getName()); } Iterator it=query.iterate(); while(it.hasNext()){ Person p=(Person) it.next(); System.out.println(p.getName()); } }控制台输出结果:Hibernate: select person0_.id as id1_2_, person0_.department as departme2_2_, person0_.name as name3_2_, person0_.sex as sex4_2_ from person person0_凯耐凯丽欧陆Hibernate: select person0_.id as col_0_0_ from person person0_凯耐凯丽欧陆@Test public void testOneCache1(){ Query query=session.createQuery("from person"); Iterator it=query.iterate(); while(it.hasNext()){ Person p=(Person) it.next(); System.out.println(p.getName()); } }控制台输出结果:Hibernate: select person0_.id as id1_2_0_, person0_.department as departme2_2_0_, person0_.name as name3_2_0_, person0_.sex as sex4_2_0_ from person person0_ where person0_.id=?凯耐Hibernate: select person0_.id as id1_2_0_, person0_.department as departme2_2_0_, person0_.name as name3_2_0_, person0_.sex as sex4_2_0_ from person person0_ where person0_.id=?凯丽Hibernate: select person0_.id as id1_2_0_, person0_.department as departme2_2_0_, person0_.name as name3_2_0_, person0_.sex as sex4_2_0_ from person person0_ where person0_.id=?欧陆总结:iterator()方法支持一级缓存。
阅读全文
0 0
- Hibernate一级缓存【Hibernate】
- Hibernate的一级缓存
- hibernate一级缓存(转)
- Hibernate一级缓存
- Hibernate一级缓存详解
- Hibernate一级缓存 & 二级缓存
- hibernate一级缓存
- Hibernate---->一级缓存
- Hibernate一级缓存,二级缓存
- Hibernate 之 一级缓存
- Hibernate一级缓存
- Hibernate一级缓存详解
- Hibernate的一级缓存
- Hibernate:一级缓存
- Hibernate一级缓存 & 二级缓存
- Hibernate-一级缓存
- Hibernate 之 一级缓存
- hibernate的一级缓存
- 简易的多组数据题模板
- codeforces #428 Div.2 B. Game of the Rows 贪心、思维
- Codeforces 839D Winter is here
- composer简介
- JAVA之面向对象
- Hibernate一级缓存
- Spring_HelloWorld
- Java虚拟机--类加载机制
- 用canvas标签实现网页H5动态时钟
- SSM WebSocket项目搭建
- 去噪自编码网络-Python Keras实现
- Oracle(11g)建库、建表空间、建用户并授权、导入导出数据表
- 锐速 (lotServer) 一键安装脚本
- 8-13 DAIRY