hibernate 之session学习
1.java对象在jvm的生命周期
通过new语句创建一个对象,jvm(虚拟机)会为对象分配一块内存空间,只要这个对象被引用变量引用,他就一直存在于内存当中,对象不被任何引用变量占用,它就结束生命周期,jvm垃圾回收站会在适当的时候回收它占用的内存
对于以上代码,对象o2在第七行结束生命周期,因为o1被c占用,所以在第八行结束生命周期。
hibernate的缓存包括一级缓存SessionFactory和二级缓存session
一级缓存针对整个数据库,一个数据库对应一个sessionFactory,所以一般是单例模式,属于重量经。
二级缓存针对一个事务,事务结束,他的生命周期结束,轻量级。
session缓存的作用
1.减少访问数据库的次数,应用程序从缓存中读取持久化的速度显然比到数据库中查询要快得多,因此,session提高数据访问的性能。
2.当缓存中持久化对象之间存在循环关联关系时,session会保证不出现访问对象图的死循环,以及由死循环引起的jvm堆栈溢出异常。
3.保证数据库中的相关记录与缓存中相应对象保持同步。对象-关系映射文件建立了静态映射,而session则建立了动态映射。
程序先把customer对象加载到缓存中,执行完修改name属性后,session缓存中customer与数据库name字段不一致了,session在清理缓存的时候,自动进行肝脏检查,然后发现不一致,就会去更新数据库中的name字段。
java对象在hibernatenate持久化层的状态
java对象在它的生命周期中,会处于以下4个状态之一:
临时状态:刚用new语句创建,还没有被持久化,并且不处于session的缓存中,处于临时状态的对象被称为临时对象。
持久化状态:已经被持久化,并且加入到session缓存中,处于持久化状态的java对象被称为持久化对象。
删除状态:不在处于session的缓存中,并且session已经计划将其从数据库中删除,处于删除状态的java对象被称为删除对象。
游离状态:已经被持久化,但不处于session的缓存中,处于游离状态的java对象被称为游离对象。
持久化类与持久化状态是不同的概念,持久化类的实例可以处于临时状态,持久化状态,删除状态和游离状态。其中处于持久化状态的实例被称为持久化对象。
当执行session1.get()方法时,ID为1的customer加入到session1中,因此变成持久化对象,此时并没有和session2关联,
对于session2是游离状态,当执行 session2.update()方法,也成为session2的持久化对象, 接下来修改name属性,会导致各自清理缓存时,
执行两条相同的update语句,我们应该避免同一个对象被两个session使用,极容易引发并发问题。