1

EJB 3.0을 사용하면 두 개의 스레드가이 코드를 실행하려고 시도합니다 (즉, 상태 비 저장 세션빈 내부). 두 스레드는 if 문을 통과하여 문을 인쇄 할 수 있습니다. 내가 성공하지 직렬화에 트랜잭션 격리 수준을 설정하려고했습니다EJB 3.0 트랜잭션 및 동기화

userTransaction.begin(); //userTransaction is of class UserTransaction 
myEntity = entityManager.find(MyEntity.class, id); //entityManager is of class EntityManager 
if (myEntity.getStatus() != "DONE") { 
    myEntity.setStatus("DONE"); 
    entityManager.merge(myEntity); 
    System.out.println("Only one thread should be running this"); 
} 
userTransaction.commit(); 

:

org.hibernate.Session session = (org.hibernate.Session) entityManager.getDelegate(); 
session.connection().setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); 

어쩌면 내가 잘못된 접근 방식을 사용하고 있습니다

.

UPDATE

제이 보스 5를 지원 does't 때문에 싱글 세션 빈을 사용할 수 없습니다. 지금은 내가 교착 상태에 재차 실행 문제를 다음 코드를 시도하고있다 :

connection.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); 
connection.setAutoCommit(false); 

//selectStatement and updateStatement are of type PreparedStatement 
selectStatement = connection.prepareStatement("SELECT STATUS FROM MYTABLE WHERE STATUS != 'DONE' AND ID=?"); 
selectStatement.setInt(1, id); 

updateStatement = connection.prepareStatement("UPDATE MYTABLE SET STATUS = 'DONE' WHERE ID=?"); 
updateStatement.setInt(1, id); 

resultSet = selectStatement.executeQuery(); 
if (resultSet.next()) { 
    updateStatement.executeUpdate(); 
} 
connection.commit(); 

답변

0

당신은 적절한 잠금 전략을 적용 & 싱글 톤 세션 빈에 관련 코드 또는 전체 방법을 전환 할 수 있습니다.

다음은 문서에서 발췌 한 것이므로 자세히 설명하지는 않습니다.

  • 싱글 컨테이너 관리 동시성의 싱글

  • 주석 @Lock와 비즈니스 또는 타임 아웃 방법 (사업 방법에 EJB 컨테이너 제어 클라이언트 액세스를 사용하는 경우 LockType.WRITE) 클라이언트가 그 메소드를 호출하는 동안 싱글 톤 세션 빈을 다른 클라이언트에게 잠글 수 있다면 ( ). 일반적으로 @Lock (LockType.WRITE) 주석은 클라이언트가 싱글 톤의 상태를 수정할 때 사용됩니다.

  • 싱글 톤 클래스에 @Lock 주석이 없으면 기본 잠금 유형 @Lock (LockType.WRITE)이 모든 비즈니스 및 시간 제한 메소드에 적용됩니다.


편집 : 해결 방법으로는 콩 또는 XML 구성을 통해 @Pool 주석을 지정 1과 풀 크기와 무 상태 세션 빈을 가질 수 있습니다.

@Pool(value=PoolDefaults.POOL_IMPLEMENTATION_STRICTMAX,maxSize=1,timeout=5000)

은 자세한 내용은 here를 참조하십시오,이 특정 JBoss는하지만, 다르게 다른 서버에 대해 구현 될 수있다.

+0

유감스럽게도 Jboss 5에서 Singleton Bean을 사용할 수 없습니다. – otonakav

+0

@otonakav EJB 3.1을 사용하고 있습니다. EJB 3.1을 사용하고 있는데 특별한 이유가 없습니다. –

+0

Jboss 5가 EJB 3.0을 사용하고 있다고 생각합니다. 질문을 편집했습니다. 그러나 이것이 EJB 3.1에 들어갈 수있는 방법이기 때문에 감사합니다. – otonakav