2012-05-11 2 views
2

StatelessSessionBean에서 성능이 떨어지는 비즈니스 메소드가 있습니다. 성능을 향상시키기 위해이 비즈니스 메소드를 몇 가지 비동기 메소드 호출로 나누고 싶습니다.Java EE의 비동기 메소드를 사용한 트랜잭션 관리

이러한 비동기 메소드는 동일한 트랜잭션 (동일한 JPA 엔티티 관리자를 사용해야 함)에서 실행해야한다는 점이 문제입니다. Java EE 사양을 이해한다면 컨테이너로 관리되는 트랜잭션을 사용할 수 없습니다. 빈 관리 트랜잭션 또는 다른 메커니즘을 사용하여이 요구 사항을 실현할 수 있습니까?

답변

4

표준 EJB 또는 확장을 사용하여이 작업을 수행 할 수 없습니다. 트랜잭션은 데이터베이스 연결에 연결되어 있으므로 여러 스레드간에 해당 연결을 공유해야합니다. 이것은 안전하지 않습니다.

또한 비동기 코드는 어떤 이유로 지연 시간이 길어질 수 있습니다. CPU로드가 높을 때 이렇게하면 불필요하게 긴 시간 동안 거래가 열리게됩니다.

어떤 옵션이 있습니까? 우선 모든 SQL 쿼리를 병렬 처리 (특히 쓰기 - 하나의 트랜잭션으로 처리해야 함)하면 많은 이점을 얻을 수 없습니다. 데이터베이스는 일반적으로 I/O 바운드입니다. 병렬 처리는 CPU를 많이 사용하는 작업이 있거나 뭔가를 기다리는 경우에만 가치가 있습니다.

두 경우 모두 코드를 재 설계하여 여러 스레드에서 병렬 코드를 수행하고 데이터베이스와 트랜잭션을 처리하는 하나의 작성기 스레드 만 갖습니다. 예를 들어 10 대의 서버를 호출해야하는 경우 응답을 수집하고 저장합니다. 10 개의 스레드를 생성/풀을 사용하고 결과를 기다리고 모든 스레드를 하나의 스레드에 저장합니다.

+0

데이터베이스는 비즈니스 메소드에 의해 수정되지 않습니다를 참조하십시오. 이것은 읽기 전용 조작입니다. 문제는 데이터베이스의 스냅 샷에서 작동하는지 확인해야한다는 것입니다. 나는. 비즈니스 메소드가 실행되는 동안 다른 사람이 만든 데이터베이스의 변경 사항을 고려해야합니다. 따라서 우리는 'repeadable read'트랜잭션을 사용했습니다. – woelfle

+0

데이터베이스 란 무엇입니까? – Nicholas

+0

MySQL의 InnoDB 데이터베이스 – woelfle