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에서 실행되기 전까지의 쿼리는 믿지 말고 실제로 실행된 쿼리를 검사해보자!
'프로그래밍 > Spring' 카테고리의 다른 글
[토비의 스프링 5장] 서비스 추상화 (0) | 2022.06.13 |
---|---|
[토비의 스프링 4장] 예외 (0) | 2022.06.10 |
[토비의 스프링 3장] 템플릿 (0) | 2022.06.09 |
[토비의 스프링 2장] 테스트 (0) | 2022.06.08 |
[토비의 스프링 1장] 오브젝트와 의존관계 (0) | 2022.05.10 |