【Hibernate七】session的缓存机制
2015-07-17 11:16
375 查看
看一个测试:
以上代码表明了session具有某种缓存机制!
session的缓存
1、生命周期
当session创建的时候,session的缓存就存在了,当执行session.close方法时,sesison关闭,缓存清空
2、缓存的性质
session缓存中存放私有数据,因为session从threadlocal中产生,所以session中的数据是线程安全的
3、操作
(1).数据库中的数据怎么样加载到缓存中
利用session.get,load,save,update,getStudents都可以把相应的数据放入到session的缓存中
根据student加载classes?
(2)应用程序在什么时候读取到缓存中的数据
利用session.get,load,getStudents(一的一端加载多的一段的集合)都可以读取到session缓存中的数据
(3)缓存中的数据怎么样进行清空
session.clear
清空缓存 把一个持久化状态变成脱管状态;对象在缓存中,那么对象就处于持久化状态;
(4)怎么样进行清空一个对象(来自于缓存)
session.evict
(5)如果缓存中的数据和数据库中的数据不同步的情况下,怎么样把缓存中的数据同步到数据库中
session.flush(),发出sql语句!不会清空缓存!
1、检查 session缓存中所有的持久化对象
①、如果该对象在数据库中有相应的记录,则查看快照区
如果一样,则什么都不做
如果不一样,则发出update语句
②、如果该对象在数据库中没有相应的记录,则进行insert操作
2、检查对象与对象之间的级联操作cascade="save-update","all"
3、检查关系操作 inverse="false"(维护关系),"true"(不维护)
(6)如何把数据库中的数据刷到缓存中
session.refresh方法
(7) 插入大量的数据时,批量操作
session.flush();
session.clear();
总结:
对象处于缓存中,那么对象就处于持久化状态;将对象从缓存中移除,对象就不在处于持久化状态!
对象是否处于持久化状态,与其是否在缓存中是息息相关的!
测试代码:
[align=left] @Test[/align] [align=left] public void testGet(){[/align] [align=left] Session session = sessionFactory.openSession();[/align] Classes classes = (Classes)session.get(Classes.class , 1L);//会发出查询语句 classes = (Classes)session.get(Classes. class, 1L);//不会发出查询语句,有缓存! [align=left] session.close();[/align] [align=left] }[/align] |
session的缓存
1、生命周期
当session创建的时候,session的缓存就存在了,当执行session.close方法时,sesison关闭,缓存清空
2、缓存的性质
session缓存中存放私有数据,因为session从threadlocal中产生,所以session中的数据是线程安全的
3、操作
(1).数据库中的数据怎么样加载到缓存中
利用session.get,load,save,update,getStudents都可以把相应的数据放入到session的缓存中
根据student加载classes?
(2)应用程序在什么时候读取到缓存中的数据
利用session.get,load,getStudents(一的一端加载多的一段的集合)都可以读取到session缓存中的数据
(3)缓存中的数据怎么样进行清空
session.clear
清空缓存 把一个持久化状态变成脱管状态;对象在缓存中,那么对象就处于持久化状态;
(4)怎么样进行清空一个对象(来自于缓存)
session.evict
(5)如果缓存中的数据和数据库中的数据不同步的情况下,怎么样把缓存中的数据同步到数据库中
session.flush(),发出sql语句!不会清空缓存!
1、检查 session缓存中所有的持久化对象
①、如果该对象在数据库中有相应的记录,则查看快照区
如果一样,则什么都不做
如果不一样,则发出update语句
②、如果该对象在数据库中没有相应的记录,则进行insert操作
2、检查对象与对象之间的级联操作cascade="save-update","all"
3、检查关系操作 inverse="false"(维护关系),"true"(不维护)
(6)如何把数据库中的数据刷到缓存中
session.refresh方法
(7) 插入大量的数据时,批量操作
session.flush();
session.clear();
总结:
对象处于缓存中,那么对象就处于持久化状态;将对象从缓存中移除,对象就不在处于持久化状态!
对象是否处于持久化状态,与其是否在缓存中是息息相关的!
测试代码:
[align=left]public class SessionCacheTest extends HibernateUtils{[/align] [align=left] /**[/align] [align=left] * 测试get方法的缓存情况![/align] [align=left] */[/align] [align=left] @Test[/align] [align=left] public void testGet(){[/align] Session session = sessionFactory.openSession(); Classes classes = (Classes)session.get(Classes.class , 1L);//会发出查询语句 classes = (Classes)session.get(Classes. class, 1L);//不会发出查询语句,有缓存! [align=left] session.close();[/align] [align=left] }[/align] [align=left] /**[/align] [align=left] * <set name="students" cascade="save-update"[/align] [align=left] * inverse="false" lazy="extra" fetch="select" >[/align] [align=left] * 测试load(),懒加载时的情况[/align] [align=left] */[/align] [align=left] @Test[/align] [align=left] public void testLoad(){[/align] [align=left] Session session = sessionFactory.openSession();[/align] Classes classes = (Classes)session.load(Classes.class , 1L);//懒加载,不会发出 sql语句 [align=left] classes.getCname(); //发出sql语句[/align] classes = (Classes)session.load(Classes. class, 1L);//不发出sql语句 [align=left] classes.getCname();[/align] [align=left] session.close();[/align] [align=left] }[/align] [align=left] /**[/align] [align=left] * 插入一个对象时,先保存到缓存中;[/align] [align=left] */[/align] [align=left] @Test[/align] [align=left] public void testSave(){[/align] [align=left] Session session = sessionFactory.openSession();[/align] [align=left] Transaction transaction = session.beginTransaction();[/align] [align=left] [/align] [align=left] Classes classes = new Classes();[/align] [align=left] classes.setCname( "e45");[/align] [align=left] session.save(classes); //cid 会自动的生成[/align] [align=left] [/align] classes = (Classes)session.get(Classes. class, classes.getCid());//不会发出 sql语句,从缓存中获取 [align=left] [/align] [align=left] transaction.commit();[/align] [align=left] session.close();[/align] [align=left] }[/align] [align=left] /**[/align] [align=left] * 更新对象时,同样先保存到缓存中,然后才同步到数据库中;[/align] [align=left] */[/align] [align=left] @Test[/align] [align=left] public void testUpdate(){[/align] [align=left] Session session = sessionFactory.openSession();[/align] [align=left] Transaction transaction = session.beginTransaction();[/align] [align=left] [/align] Classes classes = (Classes)session.get(Classes.class , 1L); [align=left] [/align] [align=left] session.evict(classes); //把一个对象从持久化状态变为托管状态,即从缓存中移除数据[/align] [align=left] [/align] [align=left] session.update(classes); //将数据重新加载到缓存,尽管没有改变属性,但是在commit时仍然会发出update语句[/align] [align=left] [/align] classes = (Classes)session.get(Classes. class, 1L);//数据已在缓存中,不会发出 sql语句 [align=left] [/align] [align=left] transaction.commit();[/align] [align=left] session.close();[/align] [align=left] }[/align] [align=left] @Test[/align] public void testUpdate2(){ [align=left] Session session = sessionFactory.openSession();[/align] [align=left] Transaction transaction = session.beginTransaction();[/align] [align=left] [/align] Classes classes = (Classes)session.get(Classes.class , 1L); [align=left] [/align] [align=left] session.evict(classes); //把一个对象从持久化状态变为托管状态,即从缓存中移除数据[/align] [align=left] [/align] classes = (Classes)session.get(Classes. class, 1L);//会发出查询的 sql语句,重新将数据加载到缓存中; [align=left] [/align] [align=left] session.update(classes); //属性没改变,不会发出update语句[/align] [align=left] [/align] [align=left] transaction.commit();[/align] [align=left] session.close();[/align] [align=left] }[/align] [align=left] /**[/align] [align=left] * 测试一对多,从一的一端获取集合;[/align] [align=left] */[/align] [align=left] @Test[/align] [align=left] public void testSet(){[/align] [align=left] Session session = sessionFactory.openSession();[/align] [align=left] Transaction transaction = session.beginTransaction();[/align] Classes classes = (Classes)session.get(Classes.class , 1L); [align=left] [/align] [align=left] Set<Student> students = classes.getStudents();//不会发出 sql语句,因为懒加载[/align] for(Student student :students){//遍历集合的时候,才发出 sql语句 [align=left] System. out.println(student.getSname());[/align] [align=left] }[/align] [align=left] [/align] [align=left] students = classes.getStudents();[/align] for(Student student :students){//数据已在缓存中,不会发出 sql语句 [align=left] System. out.println(student.getSname());[/align] [align=left] }[/align] [align=left] transaction.commit();[/align] [align=left] session.close();[/align] [align=left] }[/align] [align=left] /**[/align] [align=left] * flush方法,将缓存中的数据同步到数据库中;会更新缓存,不会清除缓存![/align] [align=left] */[/align] [align=left] @Test[/align] [align=left] public void testSession_Flush(){[/align] [align=left] Session session = sessionFactory.openSession();[/align] [align=left] Transaction transaction = session.beginTransaction();[/align] [align=left] [/align] Classes classes = (Classes)session.get(Classes.class , 1L); [align=left] Set<Student> students = classes.getStudents();[/align] for(Student student :students){ [align=left] student.setDescription( "a6");[/align] [align=left] }[/align] [align=left] session.flush(); //发出update或者insert语句,会更新缓存,不会清空缓存[/align] [align=left] [/align] classes = (Classes)session.get(Classes. class, 1L);//不发出sql语句 [align=left] students=classes.getStudents();[/align] for(Student student :students){ [align=left] System. out.println(student.getDescription());//不发出 sql语句,得到的是更新后的缓存的数据;[/align] [align=left] }[/align] [align=left] transaction.commit();[/align] [align=left] session.close();[/align] [align=left] }[/align] [align=left] [/align] [align=left] /**[/align] [align=left] * 向classes表中插入100000条数据[/align] [align=left] * 由于插入数据是先将数据保存到缓存中,数据量太大时,内存会溢出![/align] [align=left] * 故缓存中的数量达到一定数目的时候,需要flush,执行插入操作,然后clear,清空缓存[/align] [align=left] */[/align] [align=left] @Test[/align] [align=left] public void testInsertBatch(){[/align] [align=left] Session session = sessionFactory.openSession();[/align] [align=left] Transaction transaction = session.beginTransaction();[/align] [align=left] for(int i=0;i<10000;i++){//[/align] [align=left] Classes classes = new Classes();[/align] [align=left] classes.setCname( "asdf"+i);[/align] [align=left] session.save(classes);[/align] [align=left] if(i%50==0){//定时把 sql语句刷到数据库中,并且清空缓存中的数据[/align] [align=left] session.flush();[/align] [align=left] session.clear();[/align] [align=left] }[/align] [align=left] }[/align] [align=left] transaction.commit();[/align] [align=left] session.close();[/align] [align=left] }[/align] [align=left] [/align] [align=left] /**[/align] [align=left] * 把数据库中的数据同步到缓存中[/align] [align=left] */[/align] [align=left] @Test[/align] [align=left] public void testRefresh(){[/align] [align=left] Session session = sessionFactory.openSession();[/align] [align=left] Transaction transaction = session.beginTransaction();[/align] [align=left] [/align] Classes classes = (Classes)session.get(Classes.class , 1L); [align=left] classes.setDescription( "asfads");[/align] [align=left] [/align] [align=left] session. refresh(classes);//把数据库中的数据重刷到指定的对象中[/align] [align=left] [/align] [align=left] System. out.println(classes.getDescription());//得到的是数据库中的数据[/align] [align=left] [/align] [align=left] transaction.commit();[/align] [align=left] session.close();[/align] [align=left] }[/align] [align=left]}[/align] |
相关文章推荐
- oracle表机构和数据复制
- 招聘一个靠谱的 iOS
- android如何更新
- 骑驴找马被察觉怎么办?
- OAuth的授权步骤
- The Gale-Shapley Algorithm 学习笔记
- dd命令
- C语言程序的内存如何布局
- Read_tip_Splash
- 云之讯融合通讯开放平台_提供融合语音,短信,VoIP,视频和IM等通讯API及SDK。
- Delphi外挂开发网站
- 三、Linux下mysql的完整安装
- 知之道,达有余而通不足;行之道,嬴有余以弥不足。知行合一,亦乎 如是。
- java之IO处理
- Linux hosts.allow与hosts.deny文件设置
- Jsoup select 选择器
- MySQL详解--锁
- Mac下好用的HTTP/HTTPS抓包工具Charles
- 亮点面试题&&实现Singleton(辛格尔顿)模式-JAVA版本
- 教程-经典Delphi教程网