2011-02-02 3 views
1

우리는 JBoss 4.2.3에서 Spring & Hibernate를 사용하고 있으며 외부 시스템을 호출하고 있습니다. 요청을 처리하는 과정에서 다소 시간이 걸릴 수 있습니다. 오래 지속되는 데이터베이스 잠금을 제거하기 위해 외부 호출이 반환 될 때까지 데이터베이스에 쓰지 않습니다. 그러나 Hibernate는 트랜잭션이 없다는 것을 좋아하지 않으므로 우리는 (새로운 읽기 - 쓰기 서브 트랜잭션에서) 쓰기를 수행 할 때까지 Spring에 의해 시작된 읽기 전용 트랜잭션을 갖습니다. 불행히도 이것은 여전히 ​​우리가 외부 호출, 수영장에서 할당 된 연결 중에 자원을 유지하고 있음을 의미합니다. 나머지 실행 (이전 및 이후)이 필요할 때 진행중인 트랜잭션없이 외부 호출을 수행하는 방법이 있습니까? 실제로 트랜잭션이 필요하고 최대 절전 모드를 계속 유지할 때까지는 실제 트랜잭션을 연기하는 더 좋은 방법이 있습니까?진행중인 트랜잭션없이 외부 전화를 걸려면 어떻게해야합니까?

+0

하면 기다리는 요청해야합니까 마무리를위한 외부 통화? 아니면 외부 호출과 데이터베이스 쓰기가 비동기 적으로 일어날 수 있습니까? – sourcedelica

+0

예, 외부 통화가 필요한지 여부와 통화 설정 (예 : URL)을 확인하려면 Google 데이터베이스를 확인해야합니다. 또한 발신자에게 회신하기 전에 로컬 데이터베이스에 응답 할 필요가 있습니다. – Mirvnillith

답변

0

퍼시스턴스 계층에서 외부 시스템을 호출해야합니까? 당신이 끈기를 유지하기 전에, 이런 종류의 일을하는 것이 더 논리적으로 보입니다.

+0

호출 자체는 우리의 영속성 계층에서 온 것이 아니지만, 외부 호출 계층에서 읽어야 할 것들이 있습니다. 그리고 그 중 일부에 대해서는 (그리고 Hibernate가 트랜잭션/세션에 대해 까다로워 질 때) 게으른 로딩을 사용하고자합니다. – Mirvnillith

0

실제로 트랜잭션을 읽을 필요가 없습니다. 여기

이 읽기 ​​호출이 바로 DAO 객체로 이동하는 예이지만, 쓰기 호출 (Spring의 TransactionTemplate의 도우미 개체 사용) 트랜잭션 내에서 수행됩니다

public ContainerType getContainerType(Long id) { 
    return this.containerTypeDao.getContainerType(id); 
} 

public Long saveContainerType(final ContainerType containerType) { 
    return (Long) this.transactionTemplate.execute(new TransactionCallback() { 

     public Long doInTransaction(TransactionStatus status) { 
      try { 
       return containerTypeDao.saveContainerType(containerType); 
      } 
      catch (Exception e) { 
       status.setRollbackOnly(); 
       return null; 
      } 
     } 
    }); 
} 
관련 문제