밤과라임
3k
2019-08-14 13:31:41
6
239

spring boot에서 처리중인 메소드를 다시 호출하였을때 동시 처리하려면 어떻게 하면 될까요?


각각 주소가 다른 datasource 1,2가 있고

 입력처리를하는 메소드 A가 있습니다.

 컨트롤러에서

 1에 데이터를 입력하는 호출과

 2에 데이터를 입력하는 호출을 동시에 받았을때

각각 다른 데이터베이스에 A메소드대로 입력처리를 하는데

현재는 동시에 호출하면 A메소드가 1에 입력중이면 2는 대기를 하고

2가 입력중이면 1가 대기를 하는 상황으로 동시에 처리가 안되고 있습니다.

동시에 처리를 하고자 한다면 어떻게 하면 될까요?

메소드를 각각 나눠서 다르게 호출을 해야 할까요??


0
0
  • 답변 6

  • 컴포지트
    622
    2019-08-14 13:34:38

    @Async 를 알아보시기 바랍니다. 그런 블로킹 제어 흐름을 벗어나기 위해 스프링에서 준 논블록킹 기능입니다.

    0
  • 밤과라임
    3k
    2019-08-14 13:37:06

    @컴포지트

    Async로 해결하는 것 같아 찾아보니

    config 클래스에서 core size 만들고

    어노테이션 설정하는 간단한 예제들만 있어 

    적용해 본 상태인데 좀 더 찾아봐야겠네요

    감사합니다. 

    0
  • fender
    14k
    2019-08-14 13:38:02

    블로킹의 문제라기 보단 트랜잭션이나 커넥션/스레드 풀 설정의 문제 아닐까요? 강제로 동기화를 하지 않는 이상 단일 인스턴스의 메서드는 동시에 호출할 수 있습니다.

    0
  • 밤과라임
    3k
    2019-08-14 13:46:13 작성 2019-08-14 13:47:13 수정됨

    이렇게 설정해둔 상태인데 잘못된 게 있을까요?

    스프링 2.1.7 입니다


    @Configuration
    @EnableAsync
    public class AsyncConfig extends AsyncConfigurerSupport {

    @Override
    public Executor getAsyncExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(4);
    executor.setMaxPoolSize(10);
    executor.setQueueCapacity(50);
    executor.setThreadNamePrefix("async-");
    executor.initialize();
    return executor;
    }
    }
    0
  • 밤과라임
    3k
    2019-08-14 13:52:52

    @찾아보니 같은 클래스 내부의 메서드를 호출하는 것은 안된다는게 보이네요

    현재 같은 서비스 내에서 호출받는데 이게 문제일 수 있겠네요. 답변들 감사합니다.

    0
  • rezigrene
    1k
    2019-08-14 14:41:07

    1000명의 사용자가 메인페이지 요청하면 하나하나 작업완료기다리면서 처리하는건 아니니 보통은 동시에 처리되고 일부러 하나만 실행되게하는 부분을 어딘가에 집어넣었을 겁니다.

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.