본문 바로가기
프로그래밍/Spring

JDBC + MSSQL 조합 사용시 주의사항

by Loper Lee 2022. 8. 5.

JDBC + MSSQL 조합 사용시 주의사항

최근 Spring과 MSSQL 조합으로 사용시 SELECT시 CPU 사용량이 지속적으로 증가하는 문제를 겪었었다.

원인

JDBC의 MSSQL드라이버를 사용할 시 sendStringParametersAsUnicode옵션이 기본으로 true로 설정되어 있다.
해당 옵션은 모든 String 자료형을 nvarchar로 쿼리 실행에 전달하는데 varchar컬럼 검색시 형변환이 일어나면서 CPU가 마구 치솟는게 문제였다.

(@P0 nvarchar(4000))
select * 
from example
where example_varchar=@P0

해당 예제 쿼리처럼 example_varchar는 varchar컬럼인데도 불구하고 nvarchar로 검색을 시도한다.

해결 방법

해결방법은 실로 간단하다. sendStringParametersAsUnicode가 기본 값이 true인것이 문제이니 JDBC 접속 옵션에 해당 값을 false로 주면 해결된다.

url: jdbc:sqlserver://localhost:1433;sendStringParametersAsUnicode=false
(@P0 nvarchar(4000))
select * 
from example
where example_varchar=@P0

여기서 발생할 수 있는 문제점은 nvarchar컬럼을 검색하려 할때도 varchar로 문자열이 나가기 때문에 해당 부분의 옵션을 주어야 한다.

JPA의 경우 @Nationalized을 붙여주자.
MyBatis의 경우 명시적으로 어떤 타입인지 알려주자 #{column, jdbcType=NVARCHAR}

느낀점

MSSQL의 숙련도가 많이 낮다고 느낀 이슈였다.
MySQL의 경우 Real MySQL을 읽으며 DB구조에 대한 이해도를 많이 높혔는데 아무래도 락킹 기법부터 기본적인 아키텍쳐가 상당히 다르다고 느꼇다.
그리고 콘솔에서 나타나는 쿼리의 경우 신뢰도가 낮다는 것도 느낀점 중 하나였다.
실제로 DB에서 실행되기 전까지의 쿼리는 믿지 말고 실제로 실행된 쿼리를 검사해보자!