Spring + Hibernate,如何关闭StatelessSession?

时间:2012-12-05 12:07:00

标签: spring hibernate stateless-session

通常,我们使用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托管会话,并调用了这个方法。

你能说出什么问题吗?

1 个答案:

答案 0 :(得分:0)

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

有些工具可以阻止您在代码中使用此类注释,但这更像是这样:

function cons(ar) {

    var cnt = 0;

    ar.forEach(function (i, idx) {
        if (idx > 0) {
            if (i == (ar[idx - 1] + 1)){
                cnt++;
            }
            else {
                if (cnt < 2)
                    cnt = 0;
            }
        }
    });

    return cnt < 2;
}

console.log('expected true', cons([1, 2, 5, 6, 9]));
console.log('expected false', cons([0, 2, 3, 4, 6, 9]));
console.log('expected false', cons([1, 2, 3, 4, 6, 9]));