대용량 데이터 DB 저장

Jake·2023년 4월 23일
0

대용량 DB

목록 보기
1/4
post-thumbnail

이번에 해볼 미니 프로젝트는 다음과 같다.

목표 : 300만건 이상의 데이터를 DB에 저장하고 페이지네이션을 통해 마지막 페이지에 대한 데이터를 60초 이내로 조회

요구사항

  • JPA 사용하지 않고 데이터 CRUD
  • Query 문을 통한 조회
  • 마지막 페이지를 조회 할때 느린 이유를 찾기

300만건의 데이터를 JDBC를 이용하여 MYSQL DB에 저장하려고 하였다.

테스트코드

@Test
    void makeData() throws SQLException {
        for (int i = 0; i <= 3000000; i++) {
            Long id = (long) i;
            String content = "내용 없음";

            String s1 = "2022-01-01 00:00:00.000";
            String s2 = "2022-12-31 23:59:59.000";
            Timestamp tp1 = Timestamp.valueOf(s1);
            Timestamp tp2 = Timestamp.valueOf(s2);

            //save
            Post post = new Post(id, content, 10, tp1, tp2);
            this.postRepository.save(post);
        }
    }

위 코드로 실행하던 도중 소켓연결 관련 에러가 발생하였다.

This is usually caused by a limit on the number of sockets imposed by the operating system. This limit is usually configurable.

이 키워드를 통해 검색해본 결과 레지스트리 MaxUserPort 변경 의 글을 볼 수 있었다.

에러가 발생하는 이유는

  • 수신 포트 제한이 디폴트로 설정되어있다
  • 짧은 시간에 많은 socket 접속이 발생하면 사용 포트가 사용 대기 상태가 되기 전에 디폴트값을 넘어가버리므로 새 socket을 통해 port를 열 수 없게 된다

에러를 해결하기 위해 MasUserPort 값을 655534 로 변경해주었습니다.

레지스트리를 여는 방법을 몰라 ChatGpt에게 물어보았습니다.

윈도우의 경우 win+R 을 누른뒤 "regedit"을 입력하게 되면 레지스트리가 열리게 됩니다.

저의 경우 "MaxUserPort" 값이 없어 새로 만들어 주었습니다.

  • "Base" 옵션을 "10진수"로 선택합니다.
  • "값 데이터" 상자에 "65534"를 입력합니다.

이렇게 설정한 이후 재실행을 해보았는데 Primary 중복 에러가 발생하였다.

고민해본 결과 table 설정의 auto_increment 가 말썽이었다.

테이블 설정을 변경 후 다시 makeData() 테스트를 진행 결과 아래와 같이 성공적으로 진행된 것을 확인할 수 있었다.

하지만 처음 cmd 창에서 확인해본 결과 마지막 id값이 9999라고 나와 입력이 잘못되었나 ? 하고 삭제 하였더니 50001개가 삭제된 것을 확인하였다.

(id 오름차순으로 상단 10개만 불러왔지만 왜 9999로 보이는지 모르겠다..)

웹 화면

0개의 댓글

관련 채용 정보