백엔드
우리의 애플리케이션에서 PreparedStatement는 어떻게 동작하고 있는가
두줄요약
PreparedStatement가 JDBC, HikariCP, Hibernate, MySQL Connector/J에서 어떻게 동작하는지 내부 구현까지 살펴본 글입니다. 설정별 성능 차이와 운영 시 주의할 점도 함께 정리했습니다.
핵심 내용
- JDBC의 Statement와 PreparedStatement 차이, MySQL의 PREPARE 동작 방식 정리
- Hibernate, HikariCP, MySQL Connector/J 각 계층에서 PreparedStatement 설정과 내부 구현 흐름 분석
useServerPrepStmts,cachePrepStmts,prepStmtCacheSize,prepStmtCacheSqlLimit의 역할과 적용 범위 설명
성능/운영 포인트
- 서버 측 PREPARE와 JDBC 드라이버 캐시 조합에 따른 실행 시간 비교
- 단순 쿼리 테스트에서는 큰 차이가 적었고,
useServerPrepStmts=true & cachePrepStmts=false조합이 가장 비효율적 - MySQL의
max_prepared_stmt_count한도와 Connection 당 캐시 방식에 대한 주의 필요
주의할 점
- Hibernate의 동적 insert/update는 쿼리 다양성을 늘려 PreparedStatement 캐시 효율을 낮출 수 있음
- HikariCP는 PreparedStatement 캐시를 직접 관리하지 않고 JDBC 드라이버에 위임
- 내부 구현은 변경될 수 있어 코드 의존은 지양 필요
