hibernate事务与session管理小结

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应当及时关闭。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!针对您的问题,使用Hibernatesession执行任意SQL语句以及整个事务,我可以给出如下回答: 1. 执行任意SQL语句 在Hibernate,我们可以通过使用Session对象的createSQLQuery()方法来执行任意的SQL语句。该方法返回一个SQLQuery对象,我们可以通过该对象的setString()、setInteger()等方法设置参数,并通过list()、uniqueResult()等方法获取执行结果。以下是一个示例: ``` Session session = sessionFactory.openSession(); SQLQuery query = session.createSQLQuery("SELECT * FROM user WHERE id = :id"); query.setInteger("id", 1); List<Object[]> results = query.list(); for (Object[] result : results) { // 处理查询结果 } session.close(); ``` 2. 执行整个事务Hibernate,我们可以通过使用Transaction对象来执行整个事务。在一个事务,我们可以执行多个数据库操作,并可以通过commit()、rollback()方法来提交或回滚事务。以下是一个示例: ``` Session session = sessionFactory.openSession(); Transaction tx = null; try { tx = session.beginTransaction(); // 执行数据库操作 tx.commit(); } catch (Exception e) { if (tx != null) { tx.rollback(); } throw e; } finally { session.close(); } ``` 在上述示例,我们首先通过Session对象打开一个数据库连接,然后创建一个Transaction对象。在try块,我们执行数据库操作,并通过调用commit()方法来提交事务。如果在执行数据库操作时出现异常,则在catch块调用rollback()方法来回滚事务。最后,我们在finally块关闭数据库连接。 希望以上回答能够对您有所帮助!如果您有任何其他问题,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值