【问题标题】:Spring + Hibernate, how to close a StatelessSession?Spring + Hibernate,如何关闭 StatelessSession?
【发布时间】:2012-11-23 06:14:09
【问题描述】:

通常,我们使用 Spring + Atomikos 来管理 JTA 会话并将 hibernate.auto_close_session 设置为 true。 现在,如果我们手动打开一个无状态会话(对于某些异步作业):

StatelessSession sl = sessionFactory.openStatelessSession();

我们如何关闭 StatelessSession?如果我们调用

sl.close()

那么“currentSession”将回滚。 如果我们注释

@Transactional(propagation = Propagation.NOT_SUPPORTED)

在使用 StatelessSession 的方法上,提交挂起,Atomikos 日志显示它不断产生新事务并且永不停止。

完整代码:

         public Vendor findByCode(String code) {

            StatelessSession slsession = null;
            Transaction tx = null;
            try {
                    slsession = getStatelessSession();
                    tx = slsession.beginTransaction();
                    return (Vendor) slsession.createQuery("from Vendor"
                                    + " where code = :code")
                                    .setParameter("code", code)
                                    .uniqueResult();
            } catch (HibernateException e) {
                    e.printStackTrace();
                    return null;
            } finally {
                    if (slsession != null && tx != null) {
                            tx.commit();
                            slsession.close();
                    }
            }
    }

已经有一个 Spring 托管会话,并且调用了这个方法。

你能提出什么问题吗?

【问题讨论】:

    标签: spring hibernate stateless-session


    【解决方案1】:

    非常古老的未回答问题,但这里可能是一个答案: 您必须回滚事务,但无需关闭会话。除非你真的想。

    有一些工具可以防止你在你的代码中使用这个注释,但这更像是这样的:

            tx.commit();
        } catch (HibernateException e) {
            tx.rollback();
            logger.error(e);
        } 
    

    【讨论】:

      猜你喜欢
      • 2012-11-26
      • 2013-03-05
      • 1970-01-01
      • 2011-01-04
      • 2016-09-10
      • 2017-05-15
      • 2015-04-30
      • 2015-09-30
      • 2014-05-14
      相关资源
      最近更新 更多