
Microsoft JDBC Driver for SQL Server는 ResultSet 처리, 대량 복사, 매개변수 메타데이터, Always Encrypted, 인증 경로에서 불필요한 작업을 줄이는 최적화를 여러 릴리스에 걸쳐 적용했다. 애플리케이션 동작과 호환성을 유지하는 것이 원칙이며, 인증 경로 최적화는 다음 릴리스에 포함될 예정이다.
조회 결과 처리와 대량 복사
대량의 희소 결과 집합을 프로파일링한 결과, 주요 비용은 네트워크 입출력보다 메모리 할당, 임시 객체, TDS 스트림에서 값을 만드는 반복 작업에서 발생하는 경우가 많았다. 드라이버는 애플리케이션이 값을 요청할 때까지 와이어 표현을 유지하는 지연 디코딩 방식을 그대로 두고, NULL을 값 생성 전에 확인하고 재사용할 수 있는 디코더 상태를 재사용하는 등 자주 실행되는 경로를 다듬었다. 흔한 숫자·금액·시간 값은 중간 표현을 줄여 처리하고, 일반 문자열의 getString() 경로도 간소화했다. 대형 객체와 스트리밍 접근, 적응형 버퍼링의 기존 동작은 유지한다.
대량 복사 기반 배치 삽입은 기존 useBulkCopyForBatchInsert=true 설정에 연결 속성을 추가해 제약 조건 검사, 트리거 실행, ID 유지, NULL 처리, 테이블 잠금, 암호화 값 수정, 배치 크기를 조정할 수 있게 했다. 표준 PreparedStatement 프로그래밍 모델은 그대로 사용할 수 있다.
bulkCopyForBatchInsertAllowEncryptedValueModifications=true bulkCopyForBatchInsertCheckConstraints=true bulkCopyForBatchInsertFireTriggers=true bulkCopyForBatchInsertKeepIdentity=true bulkCopyForBatchInsertKeepNulls=true bulkCopyForBatchInsertTableLock=true bulkCopyForBatchInsertBatchSize=<application-defined size>
MONEY와 시간 SQL 형식이 포함된 일부 배치 삽입은 기존에 행별 처리로 전환될 수 있었지만, 변환 계층을 바꿔 지원되는 값이 대량 복사 경로에 남도록 했다. sendStringParametersAsUnicode=false일 때 불필요한 문자열 변환을 줄이고, 악센트 문자가 포함된 문자열의 인코딩 동작도 보존한다. 적용 자격 요건과 알려진 제한, 지원 데이터 형식은 대량 삽입에 대량 복사 API 사용 안내에서 확인할 수 있다.
Spark 작업에서 처리량을 높이려는 경우 JDBC packetSize를 32767로 늘리는 방안을 시험할 수 있다. 효과는 네트워크 조건, 배치 크기, 파티션 구성, 배포 환경에 따라 달라지므로 실제 작업을 대표하는 조건에서 확인해야 한다.
매개변수와 암호화 키 처리
애플리케이션이 매개변수 크기를 지정하지 않으면 드라이버가 실제 데이터보다 넓은 매개변수 선언을 만들 수 있고, 이는 SQL Server의 쿼리 계획 선택과 실행 효율에 영향을 줄 수 있다. 애플리케이션은 defineParameterType() 또는 길이 힌트를 받는 setObject() 오버로드로 예상 크기를 전달할 수 있다.
defineParameterType()로 매개변수 메타데이터를 지정한 뒤 값을 설정:
pstmt.defineParameterType(parameterIndex, Types.VARCHAR, expectedLength); pstmt.setString(parameterIndex, value);
예상 길이 힌트와 함께 값 설정:
pstmt.setObject(parameterIndex, value, Types.VARCHAR, expectedLength);
defineParameterType()은 SQL 형식과 예상 길이를 준비된 문장의 매개변수에 연결해 이후 실행과 배치 작업에서 재사용할 수 있다. setObject()의 scaleOrLength 인수는 값을 바인딩할 때 예상 길이를 전달한다. 문자·이진 매개변수의 경우 이 힌트는 생성되는 매개변수 선언에 영향을 주지만 값 자체의 길이를 제한하지 않는다. 두 API는 기존 PreparedStatement 사용 방식 및 Always Encrypted 요구 사항과 호환된다. 자세한 내용은 Microsoft Learn의 setObject 메서드 문서를 참고하면 된다.
커뮤니티 조사에서는 보안 엔클레이브를 사용하는 Always Encrypted 작업에서 키 공급자 조회가 반복되는 사례가 확인됐다. 드라이버는 기존 대칭 키 캐시를 엔클레이브 키 조회에도 적용해, 재사용 가능한 키 자료가 캐시에 있으면 공급자를 다시 조회하지 않도록 했다. 이는 기존 캐시 의미와 보안 경계를 유지하면서 불필요한 조회를 줄이기 위한 변경이다.
인증 경로와 이용 가능성
높은 동시성 환경에서는 서비스 주체 토큰을 가져올 때 경합이 확인됐다. 유효한 캐시 토큰만 필요한 요청도 토큰 갱신 조정과 관련된 동기화를 만날 수 있었다. 예정된 릴리스에서는 동기화에 들어가기 전에 토큰 캐시를 확인하고, 유효한 토큰이 있으면 기다리지 않고 반환하도록 개선할 예정이다. 또한 갱신 조정 범위를 좁혀 서로 관련 없는 인증 작업이 차단될 가능성을 줄인다. 이 변경은 기존 토큰 획득 및 갱신 동작을 유지하는 것을 목표로 한다.
최신 Microsoft JDBC Driver for SQL Server는 Maven Central에서 com.microsoft.sqlserver:mssql-jdbc로 제공된다. 재현 가능한 문제나 성능 분석 결과는 Microsoft JDBC Driver for SQL Server GitHub 저장소에 보고할 수 있다. 프로젝트는 메모리 세그먼트 API와 추가 대량 복사 개선도 살펴보고 있다.
구현 세부 정보는 관련 ResultSet 최적화 PR #2600, PR #2974, PR #2975, PR #2991, PR #2955에서 확인할 수 있다. 대량 복사 관련 내용은 PR #2555, PR #2670, PR #2735에 있다. 매개변수 메타데이터는 PR #2960과 PR #3026, Always Encrypted는 PR #2964, 인증은 PR #2982와 PR #2983에 정리돼 있다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요