문제

우리가 사용하는 최대 절전 모드(JPA)및 Hibernate Envers 지속의 역사를 개체입니다.웹 응용 프로그램이 실행되는 많은 스레드들에 의해 만들어 RMI 메소드 호출에는 다른 응용 프로그램에서,그들 중 일부에 의해 만들어 응용 프로그램 자체와 그들 중 일부는 생성하는 http 요청을 처리(생성한 전망).

우리는 또한 사용 열린 세션에서 보기 패턴을 세션 관리,그래서 우리의 web.xml 포함합니다:

<filter>
    <filter-name>openEntityManagerInViewFilter</filter-name>
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>openEntityManagerInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

데이터베이스를 사용하여 액세스 DAOs,그들 모두가 EntityManagers 주입에 의해 봄입니다.

@PersistenceContext
protected EntityManager em;

@PersistenceUnit
protected EntityManagerFactory emf;

모든 일을 아주 잘하기 전에 우리는 결정을 사용하는 최대 절전 모드 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;
}

예외에서"스레드 스케줄러는"org.hibernate.SessionException:세션은 폐쇄!에 org.hibernate.내부입니다.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:129) 에 org.hibernate.내부입니다.SessionImpl.createQuery(SessionImpl.java:1776) 에 org.hibernate.envers.도구입니다.쿼리가 있습니다.QueryBuilder.toQuery(QueryBuilder.java:226) 에 org.hibernate.envers.쿼리가 있습니다.impl.AbstractAuditQuery.buildQuery(AbstractAuditQuery.java:92) 에 org.hibernate.envers.쿼리가 있습니다.impl.EntitiesAtRevisionQuery.목록(EntitiesAtRevisionQuery.java:108) 에 org.hibernate.envers.쿼리가 있습니다.impl.AbstractAuditQuery.getSingleResult(AbstractAuditQuery.java:110) (...)

을 때 위의 코드를 실행하여 생성 스레드 그것을 잘 작동합니다.또한,이 비 envers 코드 DAO 잘 작동한다.예를 들어,아래 코드 조각

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

여 실행할 수 있습 RMI 스레드없이 문제입니다.

왜 non-기 스레드에서 메소드를 호출하 entity 관리자는 예외없이 그러나 사용할 수 없습니다 Envers'AuditReaderFactory 과는 엔티티 관리자란?내 생각에는 어쩌면을 호출하는 방법에는 엔티티 관리자를 만듭시하지 않는다 사용할 경우에 발생 Envers,는 것이 사실입니까?

무엇이 문제를 해결하는 가장 좋은 방법은 있는 문제점(도록 AuditReaderFactory 에서 이용할 수 있는 모든 쓰레드)?

도움이 되었습니까?

해결책

우리는 없는 이유를 알아에서 비 ui 스레드 메소드 호출에 대 EntityManagerFactory 일했지만 메소드 호출에 대 AuditReaderFactory 하지 않았다.어쨌든,우리는 방법을 발견했습니다.

이 솔루션을 주석 방법과 @Transactional.는 경우에는 모든 메서드에서 호출이 사슬 전에 호출 AuditReaderFactory 었으로 표시 @Transactional, 이 없 SessionException non-ui 스레드입니다.

는 것이 밝혀졌기 loadByRevision 트랜잭션이었으로는 충분하지 않습니다.는 경우 객체를 반환하는 방법이 포함된으로 지속적인 가방,그들에 대한 액세스 외부 loadByRevision 방법 범위생 LazyInitializationException (이 없었 세션).

최종 솔루션었는지 확인하는 경우,모든 쓰레드를 로드하려 일부 데이터를 데이터베이스에서,모든 선적(받고 물체에 액세스하는 게으른-로드 컬렉션)를 수행됩니다 내부 하나의 방법으로 주석 @Transactional.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top