JDBC 드라이버에 대한 준비된 명령문 메타데이터 캐싱

JDBC 드라이버 다운로드

이 문서에서는 드라이버의 성능을 향상시키기 위해 구현되는 두 가지 변경 내용에 대한 정보를 제공합니다.

준비된 문에 대한 준비되지 않은 일괄 처리

버전 6.1.6 프리뷰 이후 SQL Server로의 서버 왕복을 최소화하여 성능을 높였습니다. 이전에는 모든 prepareStatement 쿼리에 대해 준비 취소 호출도 전송되었습니다. 이제 드라이버에서는 기본값이 10인 "ServerPreparedStatementDiscardThreshold" 임계값까지 준비되지 않은 쿼리를 일괄 처리합니다.

참고 항목

사용자는 setServerPreparedStatementDiscardThreshold(int value) 메서드로 기본값을 변경할 수 있습니다.

6.1.6 프리뷰에서의 또 다른 변경 사항이 있는데, 이전 버전에서는 드라이버가 항상 sp_prepexec을 호출했다는 점이 바뀌었습니다. 이제는 준비된 명령문이 처음 실행될 때 드라이버가 sp_executesql을 호출하며, 나머지에 대해서는 sp_prepexec을 실행하고 핸들을 할당합니다. 자세한 내용은 여기에서 찾을 수 있습니다.

11.2 릴리스부터 초기 sp_executesql 호출 후 드라이버는 prepareMethod 연결 문자열 속성에 지정된 값에 따라 추가 호출에 대해 sp_prepare 또는 sp_prepexec를 실행할 수 있습니다. 자세한 내용은 연결 속성 설정을 참조하세요.

참고 항목

사용자는 setEnablePrepareOnFirstPreparedStatementCall(boolean value) 메서드를 사용해enablePrepareOnFirstPreparedStatementCall을 true로 설정하여 항상 sp_prepexec을 호출하는 이전 버전으로 기본 동작을 변경할 수 있습니다

준비된 문에 대한 준비되지 않은 일괄 처리 목적으로 이 변경 내용에 도입된 새 API 목록

SQLServerConnection

새 메서드 설명
int getDiscardedServerPreparedStatementCount() 현재 미해결 준비되지 않은 작업의 수를 반환합니다.
void closeUnreferencedPreparedStatementHandles() 미처리 무시 준비 문에 대한 준비되지 않은 요청을 강제로 실행합니다.
boolean getEnablePrepareOnFirstPreparedStatementCall() 특정 연결 인스턴스에 대한 동작을 반환합니다. false면 첫 번째 실행 시 sp_executesql을 호출하고 문을 준비하지 않습니다. 두 번째 실행이 발생하면 sp_prepare 또는 sp_prepexec를 호출하고 실제로 준비된 명령문 핸들을 설정합니다. 이후 실행 시 sp_execute를 호출합니다. 이렇게 하면 명령문이 한 번만 실행될 때 준비된 명령문 닫기에서 sp_unprepare를 사용할 필요가 없습니다. 이 옵션의 기본값은 setDefaultEnablePrepareOnFirstPreparedStatementCall() 호출로 변경할 수 있습니다.
void setEnablePrepareOnFirstPreparedStatementCall(boolean value) 특정 연결 인스턴스에 대한 동작을 지정합니다. 값이 false면 첫 번째 실행 시 sp_executesql을 호출하고 문을 준비하지 않습니다. 두 번째 실행이 발생하면 sp_prepare 또는 sp_prepexec를 호출하고 실제로 준비된 명령문 핸들을 설정합니다. 이후 실행 시 sp_execute를 호출합니다. 이렇게 하면 명령문이 한 번만 실행될 때 준비된 명령문 닫기에서 sp_unprepare를 사용할 필요가 없습니다.
int getServerPreparedStatementDiscardThreshold() 특정 연결 인스턴스에 대한 동작을 반환합니다. 이 설정은 서버의 미처리 핸들을 정리하기 위한 호출 실행 전에 연결별로 있을 수 있는 미처리 무시 작업(sp_unprepare)의 수를 제어합니다. 설정이 <= 1로 되어 있다면 준비된 문이 종료되자마자 준비 취소 작업이 곧바로 실행됩니다. {@literal >} 1로 설정된 경우 sp_unprepare를 너무 자주 호출하지 않도록 이러한 호출은 일괄 처리됩니다. 이 옵션의 기본값은 getDefaultServerPreparedStatementDiscardThreshold() 호출로 변경할 수 있습니다.
void setServerPreparedStatementDiscardThreshold(int value) 특정 연결 인스턴스에 대한 동작을 지정합니다. 이 설정은 서버의 미처리 핸들을 정리하기 위한 호출 실행 전에 연결별로 있을 수 있는 미처리 무시 작업(sp_unprepare)의 수를 제어합니다. 설정이 <= 1로 되어 있다면 준비된 문이 종료되자마자 준비 취소 작업이 곧바로 실행됩니다. > 1로 설정된 경우 sp_unprepare를 너무 자주 호출하지 않도록 이러한 호출은 일괄 처리됩니다.

SQLServerDataSource

새 메서드 설명
void setEnablePrepareOnFirstPreparedStatementCall(boolean enablePrepareOnFirstPreparedStatementCall) 이 구성이 false이면 준비된 문의 첫 번째 실행 시 sp_executesql을 호출하고 문을 준비하지 않습니다. 두 번째 실행이 발생하면 sp_prepare 또는 sp_prepexec를 호출하고 실제로 준비된 명령문 핸들을 설정합니다. 이후 실행 시 sp_execute를 호출합니다. 이렇게 하면 명령문이 한 번만 실행될 때 준비된 명령문 닫기에서 sp_unprepare를 사용할 필요가 없습니다.
boolean getEnablePrepareOnFirstPreparedStatementCall() 이 구성으로 false가 반환되면 준비된 문의 첫 번째 실행 시 sp_executesql을 호출하고 문을 준비하지 않습니다. 두 번째 실행이 발생하면 sp_prepare 또는 sp_prepexec를 호출하고 실제로 준비된 명령문 핸들을 설정합니다. 이후 실행 시 sp_execute를 호출합니다. 이렇게 하면 명령문이 한 번만 실행될 때 준비된 명령문 닫기에서 sp_unprepare를 사용할 필요가 없습니다.
void setServerPreparedStatementDiscardThreshold(int serverPreparedStatementDiscardThreshold) 이 설정은 서버의 미처리 핸들을 정리하기 위한 호출 실행 전에 연결별로 있을 수 있는 미처리 무시 작업(sp_unprepare)의 수를 제어합니다. 설정이 <= 1로 되어 있다면 준비된 문이 종료되자마자 준비 취소 작업이 곧바로 실행됩니다. {@literal >} 1로 설정된 경우 sp_unprepare를 너무 자주 호출하지 않도록 이러한 호출은 일괄 처리됩니다.
int getServerPreparedStatementDiscardThreshold() 이 설정은 서버의 미처리 핸들을 정리하기 위한 호출 실행 전에 연결별로 있을 수 있는 미처리 무시 작업(sp_unprepare)의 수를 제어합니다. 설정이 <= 1로 되어 있다면 준비된 문이 종료되자마자 준비 취소 작업이 곧바로 실행됩니다. {@literal >} 1로 설정된 경우 sp_unprepare를 너무 자주 호출하지 않도록 이러한 호출은 일괄 처리됩니다.

준비된 문 메타데이터 캐싱

6.3.0-preview 버전부터 SQL Server용 Microsoft JDBC 드라이버는 준비된 명령문의 캐싱을 지원합니다. v6.3.0 프리뷰 이전에, 이미 준비되어 캐시에 저장된 쿼리를 실행하는 경우 동일한 쿼리를 다시 호출해도 준비되지 않습니다. 이제 드라이버는 캐시에서 쿼리를 조회하고 핸들을 찾아서 sp_execute로 실행합니다. 기본적으로 준비된 문 메타데이터 캐싱은 사용 안 함으로 설정됩니다. 이를 사용하도록 설정하려면 연결 개체에서 다음 메서드를 호출해야 합니다.

setStatementPoolingCacheSize(int value) //value is the desired cache size (any value bigger than 0) setDisableStatementPooling(boolean value) //false allows the caching to take place

예: connection.setStatementPoolingCacheSize(10)connection.setDisableStatementPooling(false)

준비된 문 메타데이터 캐싱을 위해 이 변경 내용에 도입된 새 API 목록

SQLServerConnection

새 메서드 설명
void setDisableStatementPooling(boolean value) 문 풀링을 true 또는 false로 설정합니다.
boolean getDisableStatementPooling() 문 풀링을 사용하지 않도록 설정하면 true를 반환합니다.
void setStatementPoolingCacheSize(int value) 준비된 문 캐시의 크기를 이 연결에 지정합니다. 값이 1 미만이면 캐시가 없음을 뜻합니다.
int getStatementPoolingCacheSize() 이 연결에 대해 준비된 문 캐시의 크기를 반환합니다. 값이 1 미만이면 캐시가 없음을 뜻합니다.
int getStatementHandleCacheEntryCount() 현재 풀링된 준비 문 핸들의 수를 반환합니다.
boolean isPreparedStatementCachingEnabled() 이 연결에 대한 문 풀링의 사용 설정 여부입니다.

SQLServerDataSource

새 메서드 설명
void setDisableStatementPooling(boolean disableStatementPooling) 문 풀링을 true 또는 false로 설정합니다
boolean getDisableStatementPooling() 문 풀링을 사용하지 않도록 설정하면 true를 반환합니다.
void setStatementPoolingCacheSize(int statementPoolingCacheSize) 준비된 문 캐시의 크기를 이 연결에 지정합니다. 값이 1 미만이면 캐시가 없음을 뜻합니다.
int getStatementPoolingCacheSize() 이 연결에 대해 준비된 문 캐시의 크기를 반환합니다. 값이 1 미만이면 캐시가 없음을 뜻합니다.

참고 항목

JDBC 드라이버로 성능 및 안정성 개선