다음과 같은 문제가 발생합니다. 일부 처리를 수행하는 일부 서비스 bean이 있으며 세트를 반복하여 각 항목에 대해 비동기 스레드를 시작합니다. 같은 다음스프링 부트는 @Async 메소드로 트랜잭션 (및 db 연결)을 전파합니다.
@Service
public class ServiceBean {
@Autowired
private AsyncHandler asyncHandler;
public void doService(Set<?> theSet) {
for (Object obj : theSet) {
Future<?> future = asyncHandler.doHandle(obj);
// ...
}
// wait for all futures to complete
}
}
@Service
public class AsyncHandler {
@Async
public Future<?> doHandle(Object object) {
// dosth
return future;
}
}
이제 우리는 각 스레드가 자신의 거래 및 연결 풀은 매우 빠르게 빈 실행하게됩니다하여 데이터베이스 연결을 개최 것을 알 수있다.
모든 스레드에서 트랜잭션을 공유하려면 원하는 방법은 무엇입니까?
미리 감사드립니다.
수 없습니다. 트랜잭션과 연결은 ThreadLocal에 저장됩니다. 트랜잭션을 여러 스레드로 확장 할 수 없습니다. 가장 쉬운 해결책은 동시 스레드 수를 제한하는 것입니다. –
"너는 할 수 없다."나는 할 수있다. 어쩌면 스프링을 커스터마이징하는 것이 필요할 것이다. ThreadLocal에서 트랜잭션을 사용하면 새로운 스레드에서 트랜잭션을 가져오고 설정할 수 있습니다. – Benny
M. Dienum correct 답변을 삭제했습니다. –