Hibernate session浅见(1)

来源:互联网 发布:火牛抢购软件好吗 编辑:程序博客网 时间:2024/05/16 15:30

      众所周知,session接口是Hibernate中最重要的接口之一。位于org.hibernate(都是些主要接口)包下。

 

session 具有一个缓存,位于缓存中的对象我们就称之为:持久对象。他和数据库之中的相关记录相对应。session能够在某个时间点按照缓存中的对象的变化来执行相关的SQL语句,以此来与数据库进行同步,这个过程我们称之为flush,在session当中有对应的方法flush()进行缓存的清除。

 

下面分析下Session的几大作用:

1:session 是Hibernate中的一级缓存,之所以这样设计主要是为了减少访问数据库的频率以此来提高系统与数据库的效率。

2:当缓存当中的持久化对象存在循环关联的时候,session会保证不会出现对象图的死循环,以及由死循环引起的JVM内存堆栈溢出异常。

3:session保证了数据库中相关记录与缓存中的对象保持同步,从而解决了脏数据读取的问题。

 

我们发现实现Hibernate的session的类 SessionImpl当中,在清理缓存的时候,执行SQL有一个这样的顺序特点。

1:首先是按照顺序执行  session.save();

2:执行对所有实体进行更新的update方法

3:执行对所有集合的删除

4:执行对所有集合的元素进行删除 更新 或者进行SQL语句的插入

5:执行对所有集合进行插入的insert语句

6:按照应用程序调用的delete()的顺序进行删除。

 

 

那么session在什么时候进行缓存的清理呢?

具体的时间我们可以想一下,什么时候需要用到真实的数据,假设进行了数据更新什么时候会影响得数据库的函数或者触发器等。

另外,我们是不是可以强制调用以回收内存和对数据库进行强制同步。最重要的一点缓存的引入的目的是提高效率,是不是也应该在设计上考虑到这一点呢?

 

好我们就带着这几个问题分析下 session的清理缓存的时间。

 

1:调用commit(),这个容易想到,先清理缓存然后提交事务。这样做有就是将其安排在事务快结束的时候,以减少访问数据库的频率。

 

另外一个问题是,数据库在进行数据操作时要对数据的锁定。安排在这个时间点提交清理减少了数据库中相关资源的锁定时间。

 

 

2:我们不希望显示不可靠的数据。先看下flush()方法的源码

 

所以当我们查询到数据时候先要checkTransactionSynchStatus();也就是如果在缓存中的对象发生了变化,那么就会对缓存进行一次清理,使得session缓存能够与数据库同步,从而保证了查询数据的正确性。

 

 3:第三中情况就是显示的调用 flush() 以对数据进行清理和同步,但是一般情况下最好是不要强制调用 flush()方法除了以下几种情况外,推荐显示调用下 flush()

 

1: 插入删除某个特定的对象会引发数据库中的触发器,这个时候我们应该考虑下

2: 我们所写的应用程序混合了Hibernate API 和JDBC API ,由于JDBC的对缓存的不可控性,应该手动调用flush方法

 

3:那就是JDBC驱动不健壮,可能导致Hibernate无法自动正常清理缓存,这个时候应该调用。

 

除此之外可以根据业务逻辑适当的调用下flush

 

 

session 是一个序列化的接口,是Hibernate中一个及其重要的角色,session的管理非常的重要因为其涉及到缓存和数据库同步的问题,因此需要格外的注意。

最主要的还是在实战总总结session的一些内容那样能升华和深化你的理解

 

 

 

 

 

原创粉丝点击