사용자 도구

사이트 도구


mssqlserver:jdbc

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
mssqlserver:jdbc [2018/06/12 14:21]
kwon37xi [Timeout]
mssqlserver:jdbc [2018/12/18 15:01] (현재)
kwon37xi [Logging]
줄 27: 줄 27:
  
 ===== JDBC Driver 사용시 String 파라미터로인한 Full Scan 문제 ===== ===== JDBC Driver 사용시 String 파라미터로인한 Full Scan 문제 =====
 +  * [[https://​docs.microsoft.com/​ko-kr/​sql/​t-sql/​data-types/​data-type-precedence-transact-sql?​view=sql-server-2017|데이터 타입 우선순위(Data type precedence]]에 의해 **우선순위가 낮은 타입이 높은 타입으로 형변환 발생**
 +  * 우선순위에 따라 테이블의 컬럼이 ''​varchar''​이고 파라미터가 ''​nvarchar''​일 경우에는 우선순위가 낮은 ''​varchar''​ 타입 컬럼 값을 ''​nvarchar''​로 일일이 변환해서 값을 비교하기 때문에 성능이 저하되게 됨
   * [[http://​www.digitalsanctuary.com/​tech-blog/​java/​mssql-jtds-nvarchar-and-slow-indexes.html|MSSQL,​ jTDS, NVARCHAR and Slow Indexes]]   * [[http://​www.digitalsanctuary.com/​tech-blog/​java/​mssql-jtds-nvarchar-and-slow-indexes.html|MSSQL,​ jTDS, NVARCHAR and Slow Indexes]]
   * [[http://​cephas.net/​blog/​2005/​12/​02/​java-jtds-preparedstatement-and-varchar/​|Java,​ JTDS, PreparedStatement and varchar | Aaron Johnson]]   * [[http://​cephas.net/​blog/​2005/​12/​02/​java-jtds-preparedstatement-and-varchar/​|Java,​ JTDS, PreparedStatement and varchar | Aaron Johnson]]
줄 39: 줄 41:
 # 혹은 setNString() 사용 # 혹은 setNString() 사용
 </​code>​ </​code>​
- +  * ''​sendStringParametersAsUnicode=false''​로 VARCHAR 전송시에 JDBC Driver가 SQLServer 에 지정된 Collation에 따라서 ''​문자열.getBytes(Collation.charset)''​으로 byte 배열로 변환하여 전송한다. 완성형의 경우에는 ''​CP949''​로 변환. 
-혹은 JDBC 드라이버 변경없이''​convert''​로 처리한다.+    * ''​com.microsoft.sqlserver.jdbc.AppDTVImpl.SetValueOp''​ 에서 collcation에 따른 charset으로 변환해 보내는 코드 있음. 
 +  * 혹은 JDBC 드라이버 변경없이''​convert''​로 처리한다.
 <code sql> <code sql>
 ... ...
-WHERE varcharcolumn = convert(varchar,​ ?)+WHERE varcharcolumn = convert(varchar,​ ?) // 굳이 이렇게 안해도 자동으로 됨. 
 +</​code>​ 
 +  * [[java:​hibernate|Hibernate]]에서는 ''​@Nationalized''​ 사용<​code java> 
 +@Nationalized 
 +@Column(name = "​name",​ length = 16) 
 +private String name; 
 +</​code>​ 
 +  * [[java:​mybatis|MyBATIS]]는 ''​jdbcType=NVARCHAR''​사용<​code xml> 
 +SELECT * FROM books WHERE author = #{author} AND title LIKE #​{title,​jdbcType=NVARCHAR}
 </​code>​ </​code>​
- 
 ===== Logging ===== ===== Logging =====
   * MS의 JDBC Driver는 ''​java.util.logging''​ 사용   * MS의 JDBC Driver는 ''​java.util.logging''​ 사용
   * [[java:​slf4j|Slf4j]]의 jul-to-slf4j 설정 적용해야 함.   * [[java:​slf4j|Slf4j]]의 jul-to-slf4j 설정 적용해야 함.
-  * 쿼리 로그 설정+  * 쿼리 로그 설정 ​: 클래스의 패키지 구조와 로거 구조가 일치하지 않음. 또한 JDBC 드라이버 버전마다 로거가 바뀜. 그래서 안나오면 확인필요
     * ''​com.microsoft.sqlserver''​ : ''​info''​ 이상     * ''​com.microsoft.sqlserver''​ : ''​info''​ 이상
-    * ''​com.microsoft.sqlserver.jdbc.Connection''​ : ''​debug''​ +    * ''​com.microsoft.sqlserver.jdbc''​ : ''​debug''​
-    * ''​com.microsoft.sqlserver.jdbc.Statement''​ : ''​debug''​+
   * [[https://​docs.microsoft.com/​en-us/​sql/​connect/​jdbc/​tracing-driver-operation|Tracing Driver Operation]]   * [[https://​docs.microsoft.com/​en-us/​sql/​connect/​jdbc/​tracing-driver-operation|Tracing Driver Operation]]
   * [[https://​blogs.msdn.microsoft.com/​psssql/​2011/​10/​16/​easy-jdbc-logging/​|Easy JDBC Logging – CSS SQL Server Engineers]]   * [[https://​blogs.msdn.microsoft.com/​psssql/​2011/​10/​16/​easy-jdbc-logging/​|Easy JDBC Logging – CSS SQL Server Engineers]]
  
 +===== Stored Procedure =====
 +==== Stored Procedure connection catalog와 SP의 catalog가 다를 때 문제 ====
 +
 +  * Stored Procedure 사용시에,​ JDBC Driver 버그로 인해 현재 접속한 catalog(database)가 아닌 다른 catalog의 Stored Procedure 호출시 오류가 발생한다. [[https://​hibernate.atlassian.net/​browse/​HHH-12704|[HHH-12704] MSSQL executing StoredProcedure on different DB using dot notation throws error - Hibernate JIRA]]
 +<​code>​
 +The database name component of the object qualifier must be the name of the current database.
 +</​code>​
 +  * Spring JDBC Template의 [[https://​docs.spring.io/​spring/​docs/​current/​javadoc-api/​org/​springframework/​jdbc/​core/​simple/​SimpleJdbcCall.html|SimpleJdbcCall]] 에서 ''​withCatalogName()'',​ ''​withSchemaName()''​ 등을 사용해 명시적으로 catalog name을 지정해주면 괜찮다.
 +  * 아마도 JPA 등을 사용시에도 [[https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​sql/​Connection.html#​setCatalog-java.lang.String-|Connection.setCatalog()]]를 사용해도 될 것으로 보임. 작업 종료 후 원래 카탈로그로 복구 필요.
mssqlserver/jdbc.1528780872.txt.gz · 마지막으로 수정됨: 2018/06/12 14:21 저자 kwon37xi