Spring + Hibernate + Envers +多线程 - 会话关闭

  发布于 2023-02-04 19:28

我们使用Hibernate(使用JPA)和Hibernate Envers来持久化对象的历史.Web应用程序运行许多线程,其中一些是通过其他应用程序的RMI方法调用创建的,其中一些是由应用程序本身创建的,其中一些是为处理http请求而创建的(它们生成视图).

我们还使用Open Session In View模式来管理会话,因此我们的web.xml包含:


    openEntityManagerInViewFilter
    org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter



    openEntityManagerInViewFilter
    /*

使用DAO访问数据库,所有这些都有Spring注入的EntityManagers.

@PersistenceContext
protected EntityManager em;

@PersistenceUnit
protected EntityManagerFactory emf;

在我们决定使用Hibernate Envers之前,一切都运行良好.当任何不是视图生成线程的线程运行代码以获取旧版本的对象时,抛出异常.

@Override
public O loadByRevision(Long revision, Long id) {
    @SuppressWarnings("unchecked")
    O object = (O) AuditReaderFactory.get(em).createQuery().forEntitiesAtRevision(getBaseClass(), revision.intValue())
            .add(AuditEntity.id().eq(id)).getSingleResult();
    return object;
}

线程"Scheduler"中的异常org.hibernate.SessionException:会话已关闭!在Org.hibernate.envers.tools.quols.QueryBuilder.toQuery(QueryBuilder)的org.hibernate.internal.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:129)org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1776) .java:226)org.hibernate.envers.query.impl.AbstractAuditQuery.buildQuery(AbstractAuditQuery.java:92)org.hibernate.envers.query.impl.EntitiesAtRevisionQuery.list(EntitiesAtRevisionQuery.java:108)at org. hibernate.envers.query.impl.AbstractAuditQuery.getSingleResult(AbstractAuditQuery.java:110)(..)

当上面的代码由视图生成线程运行时,它工作正常.此外,DAO中的非envers代码适用于每个线程.例如,下面的代码段

@Override
public O load(Long id) {
    final O find = em.find(getBaseClass(), id);
    return find;
}

可以通过RMI线程运行而不会出现问题.

为什么非视图线程可以在没有异常的情况下调用实体管理器上的方法,但是不能将Envers的AuditReaderFactory与该实体管理器一起使用?我认为可能在实体管理器上调用方法会创建一个临时会话但是在使用Envers时不会发生,这是真的吗?

解决该问题的最佳方法是什么(以便可以从每个线程使用AuditReaderFactory)?

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有