회사에서 개발을 진행하던 중
실 사용자가 신청하는 로직을 개발하게 되었는데
문제는 사이트가 오픈되면 동시에 많은 인원이 신청을 하게되지만
신청자에는 제한이 있는 경우도 존재한다.
바로 동시성 제어가 필요하다 라는 생각을 했지만
JPA로는 동시성 제어를 해본 경험이있지만 Mybatis는 해본적이 없고
물어볼 선임이 없는 상황이라 혼자 테스트를 진행하며 기록한다.
@Autowired
private UserCommonMapper userCommonMapper;
@Test
void test() throws InterruptedException {
int numberOfThreads = 1000;
ExecutorService service = Executors.newFixedThreadPool(10);
CountDownLatch latch = new CountDownLatch(numberOfThreads);
for (int i = 0; i < numberOfThreads; i++) {
service.submit(() -> {
createTestData();
latch.countDown();
});
}
latch.await();
Integer cnt = userCommonMapper.selectCntTest();
Assertions.assertThat(cnt).isEqualTo(100);
}
void createTestData() {
Integer cnt = userCommonMapper.selectCntTest();
if (cnt < 100) {
userCommonMapper.insertTest();
}
}
synchronized void createSynchronizedTestData() {
Integer cnt = userCommonMapper.selectCntTest();
if (cnt < 100) {
userCommonMapper.insertTest();
}
}
@Test
void Test() throws Exception {
int numberOfThreads = 300;
ExecutorService service = Executors.newFixedThreadPool(100);
CountDownLatch latch = new CountDownLatch(numberOfThreads);
for (int i = 0; i < numberOfThreads; i++) {
service.submit(() -> {
try {
createData();
} catch (Exception e) {
throw new RuntimeException(e);
}
latch.countDown();
});
}
latch.await();
}
void createData() throws Exception {
UserRegisterOneDTO oneDto = new UserRegisterOneDTO();
oneDto.setOneTimeInfo(21);
oneDto.setOneLevel(55);
oneDto.setIsLevelTest("N");
oneDto.setIsBook("N");
oneDto.setIsMobilePc("mobile");
oneDto.setTime1("15:00");
oneDto.setTime2("16:00");
HttpServletRequest httpServletRequest;
httpServletRequest = null;
userSugangService.insertRegister(oneDto,httpServletRequest);
}