从Hibernate获取后台线程的新会话

Jai*_*cia 5 java websphere hibernate web-applications

我正在开发一个Web应用程序.通常在请求开始时(通过体系结构代码),打开Hibernate会话以处理数据库事务.在请求结束时,会话将关闭.这适用于我们的所有事务,除了在一个特定实例中,我想从请求中触发一个线程.该线程将调用DB事务.

从线程中,我调用"sessionFactory.openSession()",并在此会话中执行我的事务.问题出现在请求完成时,线程本身可能不一定完成.因此,当请求完成并且线程尝试执行另一个DB事务时,我得到一个Hibernate会话已关闭!错误.

无论如何,从我的线程,我可以打开一个"干净"的会话,与请求开始时打开的会话无关?

Igo*_*nov 1

您可以创建一个线程服务,它扩展HibernateAccessor为一个独立的 Spring 服务,在 处定义spring.xml,并向其发送您想要处理的代码/数据。像这样的东西:

    Session session = SessionFactoryUtils.getSession(
            getSessionFactory(), getEntityInterceptor(), getJdbcExceptionTranslator());
    SessionHolder sessionHolder = null;
    try {
        applyFlushMode(session, false);
        sessionHolder = new SessionHolder(session);
        TransactionSynchronizationManager.bindResource(getSessionFactory(), sessionHolder);
        Transaction t = getSessionFactory().getCurrentSession().beginTransaction();
        try {

            //execute your code here

            t.commit();
        } catch (Exception e) {
            t.rollback();
            log.error("Error", e);
        }
        try {
            flushIfNecessary(sessionHolder.getSession(), false);
        }
        catch (HibernateException ex) {
            throw convertHibernateAccessException(ex);
        }
    } finally {
        SessionFactoryUtils.closeSession(sessionHolder.getSession());
        TransactionSynchronizationManager.unbindResource(getSessionFactory());
    }
Run Code Online (Sandbox Code Playgroud)