`
dingjun1
  • 浏览: 215525 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

事务未正确关闭引起的HIBERNATE SESSION不能正确关闭

阅读更多
问题现象:
    第一个用户投票不成功后,换第二个用户登录,然后投票,投票成功,投票数加1(由14票,变更为15票)。这时刷新页面发现投票数为未投票前的数(14票),再刷新又为更新后的值(15票),不停的刷新,投票数会在新旧值(14与15)之间交替出现。
查看数据库中的表,值是最新的15票。

通过跟踪程序发现,当投票不成功时事务没有正常关闭。代码如下:
TransactionStatus status = [color=Red]beginTransaction();[/color]
        try {
            if (list != null) {
                for (int i = 0; i < list.size(); i++) {
                    if (((JczdTpWt) list.get(i)).getNRybh() == userid) {
                            
                        return "fail";<!-- [color=Red]问题就在这 事务没有正常关闭就退出了[/color]。-->
                    }
                }
            }
            JczdDa jczdDa = dao.getDaById(daid);
            jczdDa.setNTpsl(jczdDa.getNTpsl() + 1);
            dao.updateDa(jczdDa);
            。。。省略

            [color=Red]getTransactionManager().commit(status);[/color] 



session由 spring的工厂BEAN 址 org.springframework.orm.hibernate3.LocalSessionFactoryBean生成。
当事务打开的时候,会去线程的上下文LocalThread中找SessionHolder,如果没有找到就打开一个新的Session。包装好,放到LocalThread中去。
当事务关闭的时候,会把LocalThread中的对象清空,当前线程持有的Session关闭。
(spring中由TransactionSynchronizationManager维护当前线程的session 及事务信息)

如果事务没有关闭,会导致session一直在当前线程的LocalThread中。当下次请求到过中间件的时候,由于中间件有线程池,可能会从池中调用上次持有Session的线程
来处理新的请求,当Session要加载对象时,会从session级的缓存中查找,找到后就直接返回了,这时就看到原来的旧值。

使用spring的HibernateTemplate时,由于当前SESSION中存在事务,在执行完doInHibernate后并不会关闭session,由此会引起一系统的问题,比如session中缓存的对象会越来越多。
分享到:
评论
2 楼 dingjun1 2012-06-20  
cuisuqiang 写道
如何解决呢?我的是对了也照样缓存增加,最后死掉

关闭SESSION阿
1 楼 cuisuqiang 2012-05-03  
如何解决呢?我的是对了也照样缓存增加,最后死掉

相关推荐

    详细的spring + hibernate +struts 整合方法

    - **资源泄漏**:不正确关闭数据库连接或Session,可能导致资源泄漏,需要确保在操作完成后及时释放。 为了解决这些问题,开发者应仔细阅读官方文档,理解每个框架的工作原理,并通过单元测试和集成测试来确保各...

    Hibernate映射导致的几个异常

    这些异常通常与实体类、XML映射文件或注解配置不正确有关。 1. **`LazyInitializationException`:** 这个异常通常发生在尝试在会话关闭后访问一个延迟加载属性时。为避免此问题,可以考虑在查询时显式加载关联的...

    05_传智播客hibernate教程_实体对象的三种状态与saveOrUpdate方法

    此外,利用`SessionFactory`创建的`Session`对象和事务管理也是理解Hibernate工作流程的关键部分。 总结来说,理解和掌握实体对象的三种状态以及`saveOrUpdate`方法是优化Hibernate应用的基础。通过深入学习这些...

    使用Spring引起的错误

    通过保持Hibernate Session在整个请求周期内处于打开状态,可以避免在视图层因为Session关闭而导致的`LazyInitializationException`异常。Open Session In View可以通过两种方式进行配置: 1. **...

    Java软件开发工程师面试题宝典.doc

    - **异常捕获:** 使用try-catch-finally结构来处理异常,确保资源正确关闭。 **1.3 Spring MVC框架与Struts MVC框架对比** - **Spring MVC**: - 更灵活的控制器实现方式。 - 支持多种视图技术。 - 容易与...

Global site tag (gtag.js) - Google Analytics