hibernate session缓存和java对象生命周期
来源:互联网 发布:剑网3更新网络中断 编辑:程序博客网 时间:2024/06/04 20:04
一、java对象生命周期
1.在java中,使用new关键字,创建一个java对象,jvm就为这个对象分配一块内存空间。只要这个变量被引用,他就一直存在于内存中。如果没有被任何变量引用(包括间接引用),那么这个对象就会被垃圾回收器回收。下面用一段代码来解释:
Customer c=new Customer(); Order o1=new Order(); Order 02=new Order(); o1.setCustomer(c); c.getOrders().add(o1); o1=null; o2=null; c=null;第四行和第五行 分别建立了Customer和Order的双向关联关系。意味着c中有对o1的引用,o1有对c的引用。
*java集合有一个重要特性:集合中存放的是java对象的引用。
当执行完o1=null时,尽管变量o1不再指向Order1对象,但是通过c.getOrders(),仍然可以导航到这个Order1对象,因此Order1对象并没有结束生命周期。
当执行完o2=null时,Order2对象不再被任何引用变量引用,可以被回收。
当执行完c=null时,Customer不在被任何变量引用,结束生命周期,相应的Order1对象也不会被任何引用变量引用,也结束了生命周期。
如果希望一个java对象A一直处在生命周期中,就必须保证有一个变量引用他或者其他处于生命周期的对象B导航到这个对象A。
二、Session缓存
Session接口中实现包含了一系列的java集合,这些java集合构成了Session缓存,只要Session实例没有结束生命周期,存放在缓存中的对象也不会结束生命周期。
当时用save()方法持久化一个Customer时,Customer对象被加入到缓存中,当Session的get方法视图加载一个Customer实例时,Session先判断缓存中是否已经存在了这个Customer对象。
Session缓存的三大作用:
1.减少数据库访问次数。
2.当缓存中的持久化对象之间存在循环关联关系时,sess会保证不出现访问对象图的死循环。
3.保证数据库中的相关记录与缓存中的相应对乡保持同步。
在Session清理缓存的时候,会自动进行脏检查,如果发现Session缓存中的对象和数据库记录不一致,就会根据对象的最新属性去同步更新数据库。
三、脏数据检查和清理缓存机制
当一个Customer对象被加入到Session缓存中时,Session会为Customer对象的值类型属性复制一份快照,当清理缓存时,先进行脏检查来比较Customer对象的属性是否发生了变化,如果发生了变化就成这个对象为脏对象,从而同步更新数据库。下图显示了脏检查和同步数据库的过程。
清理缓存的时机:
还有一点:经过我的测试,虽然在调用了Session的save方法之后立即打印出了insert语句,但是数据库中的数据并没有更新,也就是没有真正的执行insert。
我们还可以自己显示的指定清理缓存的时间:通过以下方法
显示调用flush方法清理缓存一般用于以下场合:
1.插入,删除,更新某个持久化对象会引发数据库中的触发器。
2.在应用程序中,混合使用Hibernate 和jdbc
3.JDBC驱动程序不够健壮,自动清理缓存模式下,不能正常工作。
0 0
- hibernate session缓存和java对象生命周期
- Java程序员从笨鸟到菜鸟之(六十二)细谈Hibernate(十三)session缓存机制和三种对象状态
- Java程序员从笨鸟到菜鸟之(六十二)细谈Hibernate(十三)session缓存机制和三种对象状态
- hibernate 一级缓存(Session缓存)和持久化对象的四种状态
- Hibernate中的Session对象的一级缓存
- session 缓存和实体对象
- Hibernate Session篇--Hibernate的缓存及对象的状态
- Hibernate Session篇--Hibernate的缓存及对象的状态
- Hibernate(十三)session缓存机制和三种对象状态
- hibernate session生命周期示例
- Hibernate Session 的生命周期
- Hibernate中Java对象的生命周期
- Hibernate中对象的状态和生命周期
- Java 对象生命周期和类生命周期
- Java 对象生命周期和类生命周期
- Java 对象生命周期和类生命周期
- Hibernate学习(三):Session的缓存及对象的状态
- Hibernate中Session的缓存及对象的状态
- hdu5389(DP)
- 【大运维之二】DevOps年中盘点:国外最受欢迎的10篇技术文章(上)
- Ant 判断某个文件是否为空
- Android EditText限制小数点输入两位
- graylogserver打包tgz
- hibernate session缓存和java对象生命周期
- PHP 实现URL爬虫功能
- web开发中组件线程安全问题
- 【大运维之三】IT架构的渊源及方法论
- Redis 数据持久化
- python快速使用(二)python面向过程编程
- intellij idea 简单使用教程
- 单链表逆序:通过递归和循环实现。
- acid(数据库事务正确执行的四个基本要素的缩写)