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

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

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

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

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

Примечание.

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

До версии 6.2 драйвер всегда вызывает sp_prepexec. В версиях 6.2 и более поздних версиях при первом выполнении подготовленного выражения драйвер вызывает sp_executesql, а для последующих выполнения sp_prepexec и назначает ему дескриптор. Дополнительные сведения см. в разделе "Кэширование метаданных PreparedStatement".

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

Примечание.

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

Список представленных в этом изменении новых API-интерфейсов для пакетной обработки аннулирования подготовленных инструкций

Неподготовленная пакетная обработка SQLServerConnection

Новый метод Description
int getDiscardedServerPreparedStatementCount() Возвращает количество невыполненных на текущий момент действий отмены подготовки.
void closeUnreferencedPreparedStatementHandles() Вызывает принудительное выполнение всех запросов отмены подготовки для необработанных и отброшенных подготовленных инструкций.
boolean getEnablePrepareOnFirstPreparedStatementCall() (булево значение доступности подготовки при первом вызове PreparedStatement) Возвращает поведение для конкретного экземпляра подключения. Если значение равно false, первое выполнение вызывает процедуру sp_executesql и не подготавливает инструкцию. В случае второго выполнения вызывается процедура sp_prepare или sp_prepexec и фактически настраивается обработчик подготовленной инструкции. Последующие выполнения вызывают процедуру sp_execute. Это поведение избавляет от необходимости аннулировать закрываемую подготовленную инструкцию вызовомsp_unprepare, если эта инструкция выполнялась лишь один раз. Значение по умолчанию для этого параметра можно изменить, вызвав setDefaultEnablePrepareOnFirstPreparedStatementCall().
void setEnablePrepareOnFirstPreparedStatementCall(булево значение) Указывает поведение для конкретного экземпляра подключения. Если значение равно false, первое выполнение вызывает процедуру sp_executesql и не подготавливает инструкцию. В случае второго выполнения вызывается процедура sp_prepare или sp_prepexec и фактически настраивается обработчик подготовленной инструкции. Последующие выполнения вызывают процедуру sp_execute. Это поведение избавляет от необходимости аннулировать закрываемую подготовленную инструкцию вызовомsp_unprepare, если эта инструкция выполнялась лишь один раз.
int getServerPreparedStatementDiscardThreshold() Возвращает поведение для конкретного экземпляра подключения. Этот параметр определяет, сколько невыполненных операций отмены (sp_unprepare) допускается для каждого подключения, прежде чем на сервере будет выполнен вызов очистки незавершенных обработчиков. Если этот параметр имеет значение <= 1, то действия аннулирования выполняются немедленно после завершения подготовленной инструкции. Если задано значение > 1, эти вызовы объединяются вместе, чтобы избежать слишком частого вызова sp_unprepare . Значение по умолчанию для этого параметра можно изменить, вызывая метод getDefaultServerPreparedStatementDiscardThreshold().
void setServerPreparedStatementDiscardThreshold(int value) Указывает поведение для конкретного экземпляра подключения. Этот параметр определяет, сколько невыполненных операций отмены (sp_unprepare) допускается для каждого подключения, прежде чем на сервере будет выполнен вызов очистки незавершенных обработчиков. Если этот параметр имеет значение <= 1, то действия аннулирования выполняются немедленно после завершения подготовленной инструкции. Если задано значение > 1, эти вызовы объединяются вместе, чтобы избежать слишком частого вызова sp_unprepare .

Неподготовленная пакетная обработка SQLServerDataSource

Новый метод Description
void setEnablePrepareOnFirstPreparedStatementCall(boolean enablePrepareOnFirstPreparedStatementCall) Если значение равно false, первое выполнение подготовленной инструкции вызовет sp_executesql без подготовки инструкции. Если происходит второе выполнение, он вызывает sp_prepare или sp_prepexec настраивает подготовленный дескриптор инструкции. Последующие выполнения вызывают процедуру sp_execute. Это поведение устраняет необходимость закрывать подготовленное выражение, если оно выполняется только один раз.
boolean getEnablePrepareOnFirstPreparedStatementCall() Если значение равно false, первое выполнение подготовленной инструкции вызовет sp_executesql без подготовки инструкции. В случае второго выполнения вызывается процедура sp_prepare или sp_prepexec и фактически настраивается обработчик подготовленной инструкции. Последующие выполнения вызывают процедуру sp_execute. Это поведение устраняет необходимость закрывать подготовленное выражение, если оно выполняется только один раз.
void setServerPreparedStatementDiscardThreshold(int serverPreparedStatementDiscardThreshold) Этот параметр определяет, сколько невыполненных операций отмены (sp_unprepare) допускается для каждого подключения, прежде чем на сервере будет выполнен вызов очистки незавершенных обработчиков. Если этот параметр имеет значение <= 1, то действия аннулирования выполняются немедленно после завершения подготовленной инструкции. Если задано значение > 1, эти вызовы объединяются вместе, чтобы избежать слишком частого вызова sp_unprepare
int getServerPreparedStatementDiscardThreshold() Этот параметр определяет, сколько невыполненных операций отмены (sp_unprepare) допускается для каждого подключения, прежде чем на сервере будет выполнен вызов очистки незавершенных обработчиков. Если этот параметр имеет значение <= 1, то действия аннулирования выполняются немедленно после завершения подготовленной инструкции. Если задано значение > 1, эти вызовы объединяются вместе, чтобы избежать слишком частого вызова sp_unprepare .

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

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

Новый метод Description
void setDisableStatementPooling(логическое значение) Задает значение true или false для параметра создания пула инструкций.
boolean getDisableStatementPooling() Возвращает значение true, если создание пула инструкций отключено.
void setStatementPoolingCacheSize(int value) Задает размер кэша подготовленных инструкций для этого подключения. Значение < 1 означает отсутствие кэша.
int getStatementPoolingCacheSize() Возвращает размер кэша подготовленных инструкций для этого подключения. Значение < 1 означает отсутствие кэша.
int getStatementHandleCacheEntryCount() Возвращает текущее число обработчиков подготовленных инструкций в составе пула.
булево значение isPreparedStatementCachingEnabled() Возвращает сведения о том, включено ли создание пула инструкций для этого подключения.

Кэширование метаданных SQLServerDataSource

Новый метод Description
void setDisableStatementPooling(boolean disableStatementPooling) Задает значение true или false для параметра создания пула инструкций.
boolean getDisableStatementPooling() Возвращает значение true, если создание пула инструкций отключено.
Функция void setStatementPoolingCacheSize(int statementPoolingCacheSize) Задает размер кэша подготовленных инструкций для этого подключения. Значение < 1 означает отсутствие кэша.
int getStatementPoolingCacheSize() Возвращает размер кэша подготовленных инструкций для этого подключения. Значение < 1 означает отсутствие кэша.

См. также

Повышение производительности и надежности с помощью драйвера JDBCПроизводительность параметров подготовленных инструкций