헤르메스 LIFE

[Spring Boot] JPA 동시 입력 테스트 본문

Spring Boot Framework

[Spring Boot] JPA 동시 입력 테스트

헤르메스의날개 2022. 2. 27. 12:15
728x90

테스트 환경

https://hermeslog.tistory.com/568?category=1078420 

 

[Spring Boot] HikariCP를 이용한 Database Connection + JPA

개발환경 1. STS 버전 : 4.13.1 2. JDK 버전 : OpenJDK 11.0.14_9_x64 3. Tomcat 버전 : 9.0.56 4. Maven 버전 : 3.8.4 5. Spring 버전 : Spring Boot 2.6.3 6. Database : Docker 에 DB 설치 - primary - Postgre..

hermeslog.tistory.com


MultiThreadMemberSaveTest.java

package com.study.springboot.system.repository;

import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import com.study.springboot.system.entity.Member;

@RunWith(SpringRunner.class)
@SpringBootTest
// @DataJpaTest
public class MultiThreadMemberSaveTest {
    @Autowired(required = true)
    MemberRepository memberRepository;

    @Test
    // @Rollback(false)
    public void field() throws Exception {

        System.out.println("main start .......");

        for (int i = 0; i < 100; i++) {
            Runnable task = new Task1();

            Thread thread = new Thread(task);
            thread.setName("thread-A" + i);

            thread.start();
        }

        for (int i = 0; i < 100; i++) {
            Runnable task = new Task2();

            Thread thread = new Thread(task);
            thread.setName("thread-B" + i);

            thread.start();
        }

        for (int i = 0; i < 100; i++) {
            Runnable task = new Task3();

            Thread thread = new Thread(task);
            thread.setName("thread-C" + i);

            thread.start();
        }

        Thread.sleep(10000);  // 재우지 않으면 Connection 이 Close 되어버림.

        System.out.println("main exit .......");
    }

    class Task1 implements Runnable {

        @Override
        public void run() {

            Member member = new Member("memberA", "");
            member = memberRepository.save(member);

            System.out.println(Thread.currentThread() + " >> " + member.toString());

        }

    }

    class Task2 implements Runnable {

        @Override
        public void run() {

            Member member = new Member("memberB", "");
            member = memberRepository.save(member);

            System.out.println(Thread.currentThread() + " >> " + member.toString());

        }

    }

    class Task3 implements Runnable {

        @Override
        public void run() {

            Member member = new Member("memberC", "");
            member = memberRepository.save(member);

            System.out.println(Thread.currentThread() + " >> " + member.toString());

        }

    }
}

Test 결과

더보기

springboot=# select *
  from member;
  id  | password | username
------+----------+----------
 1605 |          | memberA
 1614 |          | memberB
 1613 |          | memberB
 1609 |          | memberB
 1608 |          | memberA
 1611 |          | memberA
 1610 |          | memberB
 1612 |          | memberA
 1619 |          | memberA
 1615 |          | memberB
 1617 |          | memberA
 1620 |          | memberA
 1621 |          | memberC
 1622 |          | memberB
 1623 |          | memberB
 1624 |          | memberA
 1625 |          | memberA
 1628 |          | memberB
 1626 |          | memberB
 1630 |          | memberA
 1632 |          | memberA
 1634 |          | memberC
 1631 |          | memberB
 1633 |          | memberA
 1636 |          | memberC
 1635 |          | memberB
 1637 |          | memberC
 1640 |          | memberA
 1641 |          | memberA
 1643 |          | memberA
 1642 |          | memberB
 1644 |          | memberC
 1646 |          | memberA
 1647 |          | memberC
 1649 |          | memberA
 1650 |          | memberB

............................

springboot=# select count(1) from member;
 count
-------
   300
(1 row)


JPA 는 동시 입력시 Lock 이 잘 걸리지 않는 모양입니다. ^^

만족스러운 테스트 결과 였습니다.

728x90