Кэширование метаданных подготовленной инструкции для JDBC Driver

Скачать драйвер JDBC

В этой статье содержатся сведения об этих двух изменениях, реализованных для повышения производительности драйвера.

Пакетная обработка аннулирования подготовленных инструкций

Начиная с версии 6.1.6-preview, повышение производительности реализовано за счет минимизации круговых путей к SQL Server. Ранее для каждого запроса prepareStatement также отправлялся вызов аннулирования. Теперь драйвер выполняет пакетную обработку запросов вплоть до порогового значения ServerPreparedStatementDiscardThreshold, которое по умолчанию равно 10.

Примечание

Пользователи могут изменить значение по умолчанию с помощью следующего метода: setServerPreparedStatementDiscardThreshold(int value).

Еще одно изменение, представленное в версии 6.1.6-preview, заключается в том, что драйвер всегда вызывает хранимую процедуру sp_prepexec. Теперь для первого выполнения подготовленной инструкции драйвер вызывает хранимую процедуру sp_executesql, а в остальных случаях он выполняет процедуру sp_prepexec и назначает ей обработчик. Дополнительные сведения можно найти здесь.

Начиная с выпуска 11.2 после первоначального вызова sp_executesql драйвер может выполнить sp_prepare или sp_prepexec для дополнительных вызовов в зависимости от значения, указанного в свойстве строки подключения prepareMethod. Дополнительные сведения см. в статье о настройке свойств подключения.

Примечание

Пользователи могут изменить поведение по умолчанию в предыдущих версиях, которые всегда вызывают процедуру sp_prepexec, установив для параметра enablePrepareOnFirstPreparedStatementCall значение True с помощью следующего метода: setEnablePrepareOnFirstPreparedStatementCall(boolean value).

Список представленных в этом изменении новых 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, драйвер Microsoft JDBC Driver for SQL Server поддерживает кэширование подготовленных инструкций. До версии 6.3.0-preview, если выполняется запрос, который уже был подготовлен и сохранен в кэше, повторный вызов того же запроса не приведет к его подготовке. Теперь драйвер ищет запрос в кэше, находит обработчик и выполняет запрос с помощью 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 Driver