hikariCP (hikari Connection Pool)란 고성능 JDBC 커넥션 풀 라이브러리이다.
Connection Pool : 초기에 여러개의 연결을 미리 하고, 요청에 따라 연결 사용, 반환을 지원
기존 JDBC 연결은 요청시마다 다음과 같은 과정을 거친다.
드라이버 로드 - 커넥션 객체 생성 - 커넥션 객체 연결 - 커넥션 객체 종료
이러한 과정은 모든 요청에 각각의 커넥션을 만들기 때문에 자원 소모도 심하고, 응답 시간도 오래 걸리게 된다.
단점을 보완하기 위해 hikariCP와 같은 DBCP를 사용하게 된다.
// 애플리케이션 구동시 [초기 1회]
커넥션 객체 다수 생성
// 이후 요청
커넥션 제공 - 커넥션 반환
비유로 표현하자면 다음과 같다.
산과 산 사이를 사람이 건너고자 하는 상황이다.
기존 JDBC 연결 : 건너고자 하는 사람이 관계자에게 열기구를 요청해 타고 넘어감
DBCP : 건너고 싶은 사람이 생기자, 케이블카를 여러 라인 설치해 운영함
hikariCP에는 auto-commit이라는 설정이 있다.
이 설정탓에 쿼리문이 기하급수적으로 늘어나는 경우, 성능에 악영향을 끼칠 수 있다.
auto-commit의 기본값은 true로, 각 쿼리가 자동으로 커밋될 수 있게 해주는 설정이다.
spring:
datasource:
hikari:
auto-commit: false
다음과 같이 application 설정파일에서 변경할 수 있다.
auto-commit이 true/false인 상황의 쿼리문을 비교해보겠다.
# auto-commit : true
SELECT * FROM users WHERE id = 1;
SELECT * FROM orders WHERE user_id = 1; -- Lazy loading
# auto-commit : false
BEGIN;
SELECT * FROM users WHERE id = 1;
SELECT * FROM orders WHERE user_id = 1; -- Lazy loading
COMMIT;
true인 경우 각각의 쿼리가 자동으로 커밋이 이루어진다.
false인 경우 쿼리문 전체의 시작과 끝을 묶어 한번에 쿼리를 커밋한다.
위 예시와 같이 쿼리문이 2, 3줄 등 적을경우 차이가 없을 수 있지만, 검색 매커니즘등 쿼리가 많이 일어나는 경우
유의미한 차이를 보일 수 있다.
OSIV의 기본값은 true로, 트랜잭션이 뷰 렌더링까지 확장되어, Lazy loading을 뷰에서 처리할 수 있게 해준다.
하지만 데이터베이스 커넥션이 오래 열려있을 수 있어, 서버 응답시간에 영향을 끼친다.
spring:
jpa:
open-in-view: false
auto-commit이 false인 상황에서 OSIV가 true/false일때의 쿼리문을 비교해보겠다.
# auto-commit : false, open-in-view: true
BEGIN;
SELECT * FROM users WHERE id = 1;
SELECT * FROM orders WHERE user_id = 1; -- Lazy loading
COMMIT;
# auto-commit : false, open-in-view: false
BEGIN;
SELECT * FROM users WHERE id = 1;
COMMIT;
SELECT * FROM orders WHERE user_id = 1; 가 Lazy loading 방식이기 때문에 시행되지 않는다.
이럴땐 @Transactional 어노테이션을 이용해 Lazy loading을 초기화해주면 된다.