사용자 도구

사이트 도구


mssqlserver:jdbc

MS SQL Server JDBC

Timeout

설정값이 millisecond와 second가 섞여 있어서 매우 주의해야 함.

JDBC Driver 사용시 String 파라미터로인한 Full Scan 문제

# JDBC URL 파라미터로 아래 지정하면 VARCHAR 로 강제로 전송함
sendStringParametersAsUnicode=false
단, 이 경우에도 JDBC 4 에서 지원하는 setNString() 같은 setN* 계열 사용시에는 Unicode로 전송한다.

# sendStringParametersAsUnicode=false 상황에서도 NVARCHAR 전송이 필요하면
pStmt.setObject(2,Id,Types.NVARCHAR); //강제로 Unicode로 전송
# 혹은 setNString() 사용
  • sendStringParametersAsUnicode=false로 VARCHAR 전송시에 JDBC Driver가 SQLServer 에 지정된 Collation에 따라서 문자열.getBytes(Collation.charset)으로 byte 배열로 변환하여 전송한다. 완성형의 경우에는 CP949로 변환.
    • com.microsoft.sqlserver.jdbc.AppDTVImpl.SetValueOp 에서 collcation에 따른 charset으로 변환해 보내는 코드 있음.
  • 혹은 JDBC 드라이버 변경없이convert로 처리한다.
...
WHERE varcharcolumn = CONVERT(VARCHAR, ?) // 굳이 이렇게 안해도 자동으로 됨.
  • Hibernate에서는 @Nationalized 사용
    @Nationalized
    @Column(name = "name", length = 16)
    private String name;
  • MyBATISjdbcType=NVARCHAR사용
    SELECT * FROM books WHERE author = #{author} AND title LIKE #{title,jdbcType=NVARCHAR}

Logging

  • MS의 JDBC Driver는 java.util.logging 사용
  • Slf4j의 jul-to-slf4j 설정 적용해야 함.
  • 쿼리 로그 설정 : 클래스의 패키지 구조와 로거 구조가 일치하지 않음. 또한 JDBC 드라이버 버전마다 로거가 바뀜. 그래서 안나오면 확인필요
    • com.microsoft.sqlserver : info 이상
    • com.microsoft.sqlserver.jdbc : debug

Stored Procedure

Stored Procedure connection catalog와 SP의 catalog가 다를 때 문제

The database name component of the object qualifier must be the name of the current database.
  • Spring JDBC Template의 SimpleJdbcCall 에서 withCatalogName(), withSchemaName() 등을 사용해 명시적으로 catalog name을 지정해주면 괜찮다.
  • 아마도 JPA 등을 사용시에도 Connection.setCatalog()를 사용해도 될 것으로 보임. 작업 종료 후 원래 카탈로그로 복구 필요.
mssqlserver/jdbc.txt · 마지막으로 수정됨: 2022/03/31 17:32 저자 kwon37xi