커넥션풀과 데이터소스 이해

존스노우·2023년 11월 11일
0

  • 이전 코드는 커넥션을 항상 획득함

  • 드라이버와 디비는 커넥션 -> 3way handshake 동작 발생

  • 이런 커넥션은 과정 복잡 시간도 많이 소요됨

  • 이런 비용이큰 작업을 커넥션 풀이라는 방법으로 해결

  • 보통 10개 정도 확보해 놓고 풀에 보관함

  • 작업이 끝나면 살아 있는 상태로 커넥션 풀에 반환
  • 최근에는 hikariCp를 사용함

DataSource

  • 항상 신규 커넥션이 생성됨.
  • 이걸 커넥션 풀을 사용하는 방법으로 어떻게 변경할까

  • 애플리케이션 코드도 바꿔줘야된다 ->HikariCP로 바꾸기 위해

  • 이걸 추상화하는 방법이 없을까 ?

  • 커넥션을 어떻게 얻을가에 고민하다가 !

  • 자바에서 한번 더 추상화

  • 이 커넥션 어떻게 획득할꺼야?

  • 이게 Datasource

  • 실제 디비에서 서로다른 커넥션 두개를 가져온다.
  • 이번에는? 스프링이적용되는 드라이버 데이터소스를 적용


  • 새롭게 jdbc 매니저를 통해 커넥션을 만든다.
  • 차이는?
  • 데이터소스 인터페이스를 통해서 가져온다.

  • 드라이버 매니저는 내가 호출할때마다 Url, username, passwd를 넣어줘야됨
  • 드라이버 매니저데이터소스는 그냥 GetConnection만 호출하면 됨.
  • 미리 셋팅했으니

DataSource 예제2 - 커넥션 풀

  • 히카리CP로 구현

  • pool 에 added 가 됨
  • MyPool connection adder에서

  • 다양한 설정 값들..
  • close를 안해서 활성화가 2개가 되었다 클로즈는 필수
  • tcp 외부랑 접속을해야되서 커넥션 채울떄까지 마냥 대기하고 있다 실행 시간이 늦어짐

  • 히카리가 만들어준 인스턴스 외부에 연결해서 커넥션을 가지고 있다

  • 안에 들어있는건 ?
  • jdbc 커넥션 0, 1번이 들어있다.

  • 커넥션 풀에 커넥션차기전에 커넥션을 획득한다면 ?
  • 커넥션 풀이 내부에서 기다려 줌 10개 까지 안찼으니
  • 내부적으로 커넥션 획득
  • 이럴 때는 약간 대기 시간이 걸릴 수 있다.

  • 10개가 넘어버리면?
  • 여기서는 초과가 되버림
  • pool이 확보 될때까지 블락
  • 30초정도 기다리다 예외를 터트린다.

DataSource 적용

  • 기존코드에서 close , getConnection 부분을 이런식으로 바꿔준다
  • 예외도 따로 구현 해준다


  • 커넥션을 설정해주고

  • 테스트 실행시 계속 커넥션을 맺는다.
  • 쿼리를 한번실행 할대마다
  • 드라이버 매니저 데이터 소스를 사용했기 때문에 !
  • 히카리를 써보자

  • Pool을 꽉 채운다.

  • 근대 왜 커넥션이 0 지?
  • 커넥션 pool일경우 클로즈일경우?
  • 반환하기때문에 반환하고 썻다가 반환하고 썻다가 반복하는거임
  • 인스턴스 주소들은 다 다르다

  • 1번을 반환해줄때 히카리 프록시 객체를 생성하고
  • 실제 tcp/ip 연결된 커넥션을 넣어서 반환해줌
  • 또 조회 하면 프록시 객체 생성해서 다시 0번을 담았다가 반환해줌
profile
어제의 나보다 한걸음 더

0개의 댓글