hibernate事务与session管理小结

来源:互联网 发布:网络贷款好口子 编辑:程序博客网 时间:2024/04/27 20:25

hibernte中的事务transaction是hibernate框架中的最小处理单元,一般来说,一个请求应该对应一个事务,并在请求结束之后提交这个事务。

事务是由hibernate的一级缓存session开始的。通常情况下,session中存放了一堆需要持久化的对象,这些对象将在事务提交的时候完成持久化。

很多对hibernate还不太熟悉的程序员,在用hibernate时,总是不知道hibernate的事务将何时开启,何时提交,session又将何时创建,何时关闭。因此,在编程的时候,并没有很好地管理事务与session,该提交的时候没提交,该关闭的时候也没关闭。这样的情况,对程序不会造成明显的异常,而且看上去执行速度还比较快(因为session一直留在在内存中)。然而,这种情况造成的后果是很严重的,很有可能在程序运行一段时间后,造成服务器内存溢出或数据库连接爆满。虽然重启服务暂时能解决这个问题,但不是所有的项目是有时间等你重启的,像呼叫中心这种实时性极高的项目,在工作高峰期重启造成的后果是不堪设想!

所有hibernate的事务应该对应一个独立的请求。什么叫独立的请求?所谓独立的请求不是指要跳转至哪个页面,而是用户想要执行的功能中某一项独立的业务。比如一个淘宝买家想查看自己浏览过的记录,同时又能看到买过这些东西的人浏览过的其它商品。这是一个功能,但是,这里却有两个不同的业务: 1. 看自己浏览过的记录。2. 看买过这些东西的人浏览过的其它商品。因此应该对应两个事务。也有的功能看似有两项业务,实际上只有一个。比如转账,转账是要先将某一个账户的钱取出来,再将取出来的钱注入到另一个账户中去。这里看似完成了两件事,然而却是在同一时间完成,不然就是转账失败。因此,这只是一个事务。这样,我们可以说,所有hibernate事务应该在一个独立的请求后开始,在请求结束后提交。

事务的问题解决了,session就好办了。session只是hibernate中一个轻量级的对象,它可以随时开启和关闭。而事务是由session来开启的,所以,每次开启一个事务之前,应该从工厂中获取session,事务提交后,就关闭session。虽然,session可以复用,并且作为缓存,留存的时间越长,程序的执行速度将更快。但依我个人来看,不同的业务在程序中的配合执行多是复杂的,想实现session的复用而没有及时关闭的代价就是可能造成连接得不到及时释放。因此,在程序的执行速度与项目运行的稳定上作比较,我肯定选择后者。

总之,做hibernate开发,应该先分析哪些是属于独立的事务,所有的事务与session是一一对应的,并且事务应当及时提交,session应当及时关闭。

原创粉丝点击