Metadados de instrução em cache preparados para o JDBC Driver

Baixar driver JDBC

Este artigo fornece informações sobre as duas alterações que foram implementadas para aprimorar o desempenho do driver.

Envio em lote de instruções de cancelamento de preparação para instruções preparadas

Desde a versão 6.1.6-preview, um aprimoramento no desempenho foi implementado por meio da minimização de viagens de ida e volta do servidor para o SQL Server. Anteriormente, para cada consulta prepareStatement, uma chamada de cancelamento de preparação também foi enviada. Agora, o driver está enviando em lote consultas de cancelamento de preparação até o limite "ServerPreparedStatementDiscardThreshold", que tem um valor padrão de 10.

Observação

Os usuários podem alterar o valor padrão com o seguinte método: setServerPreparedStatementDiscardThreshold(int value)

Outra alteração que foi introduzida na versão 6.1.6 – versão prévia é que antes dessa versão, o driver sempre chamava sp_prepexec. Agora, para a primeira execução de uma instrução preparada, o driver chama sp_executesql e, para o restante, ele executa sp_prepexec e atribui um identificador a ele. Encontre mais detalhes aqui.

A partir da versão 11.2, após a chamada inicial sp_executesql, o driver pode executar sp_prepare ou sp_prepexec para chamadas adicionais, dependendo do valor especificado na propriedade da cadeia de conexão prepareMethod. Para obter mais informações, veja Configuração das propriedades de conexão.

Observação

Os usuários podem alterar o comportamento padrão para as versões anteriores chamando sempre sp_prepexec configurando enablePrepareOnFirstPreparedStatementCall como true usando o seguinte método: setEnablePrepareOnFirstPreparedStatementCall (valor booleano)

Lista das novas APIs introduzidas com essa alteração, para o envio em lote de cancelamento de preparação para instruções preparadas

SQLServerConnection

Novo método Descrição
int getDiscardedServerPreparedStatementCount() Retorna o número das ações de cancelamento de preparação atualmente pendentes.
void closeUnreferencedPreparedStatementHandles() Força o cancelamento da preparação de solicitações para as instruções preparadas descartadas pendentes a serem executadas.
boolean getEnablePrepareOnFirstPreparedStatementCall() Retorna o comportamento de uma instância de conexão específica. Se for false, a primeira execução chamará sp_executesql e não preparará uma instrução. Se ocorrer uma segunda execução, ela chamará sp_prepare ou sp_prepexec e configurará um identificador de instrução preparado. Chamada de execuções posteriores sp_execute. Esse comportamento elimina a necessidade de sp_unprepare no fechamento da instrução preparada se a instrução é executada apenas uma vez. O padrão para essa opção pode ser alterado chamando setDefaultEnablePrepareOnFirstPreparedStatementCall().
void setEnablePrepareOnFirstPreparedStatementCall(boolean value) Especifica o comportamento de uma instância de conexão específica. Se o valor for false, a primeira execução chamará sp_executesql e não preparará uma instrução. Se ocorrer uma segunda execução, ela chamará sp_prepare ou sp_prepexec e configurará um identificador de instrução preparado. Chamada de execuções posteriores sp_execute. Esse comportamento elimina a necessidade de sp_unprepare no fechamento da instrução preparada se a instrução é executada apenas uma vez.
int getServerPreparedStatementDiscardThreshold() Retorna o comportamento de uma instância de conexão específica. Essa configuração controla quantas ações de descarte pendentes (sp_unprepare) podem haver por conexão antes que uma chamada para limpar os identificadores pendentes no servidor seja executada. Se a configuração for < = 1, ações de cancelamento de preparação serão executadas imediatamente no fechamento da instrução preparada. Caso ela seja definida como {@literal >} 1, essas chamadas serão agrupadas em lote para evitar a sobrecarga de uma chamada muito frequente ao sp_unprepare. O padrão para essa opção pode ser alterado chamando getDefaultServerPreparedStatementDiscardThreshold().
void setServerPreparedStatementDiscardThreshold(int value) Especifica o comportamento de uma instância de conexão específica. Essa configuração controla quantas ações de descarte pendentes (sp_unprepare) podem haver por conexão antes que uma chamada para limpar os identificadores pendentes no servidor seja executada. Se a configuração for < = 1, ações de cancelamento de preparação serão executadas imediatamente no fechamento da instrução preparada. Caso ela seja definida como >1, essas chamadas serão agrupadas em lote para evitar a sobrecarga de uma chamada muito frequente ao sp_unprepare.

SQLServerDataSource

Novo método Descrição
void setEnablePrepareOnFirstPreparedStatementCall(boolean enablePrepareOnFirstPreparedStatementCall) Se essa configuração for false, a primeira execução de uma instrução preparada chamará sp_executesql e não preparará uma instrução. Se ocorrer uma segunda execução, ela chamará sp_prepare ou sp_prepexec e configurará um identificador de instrução preparado. Chamada de execuções posteriores sp_execute. Esse comportamento elimina a necessidade de sp_unprepare no fechamento da instrução preparada se a instrução é executada apenas uma vez.
boolean getEnablePrepareOnFirstPreparedStatementCall() Se essa configuração retornar false, a primeira execução de uma instrução preparada chamará sp_executesql e não preparará uma instrução. Se ocorrer uma segunda execução, ela chamará sp_prepare ou sp_prepexec e configurará um identificador de instrução preparado. Chamada de execuções posteriores sp_execute. Esse comportamento elimina a necessidade de sp_unprepare no fechamento da instrução preparada se a instrução é executada apenas uma vez.
void setServerPreparedStatementDiscardThreshold(int serverPreparedStatementDiscardThreshold) Essa configuração controla quantas ações de descarte pendentes (sp_unprepare) podem haver por conexão antes que uma chamada para limpar os identificadores pendentes no servidor seja executada. Se a configuração for < = 1, ações de cancelamento de preparação serão executadas imediatamente no fechamento da instrução preparada. Caso ela seja definida como {@literal >} 1, essas chamadas serão agrupadas em lote para evitar a sobrecarga de uma chamada muito frequente ao sp_unprepare
int getServerPreparedStatementDiscardThreshold() Essa configuração controla quantas ações de descarte pendentes (sp_unprepare) podem haver por conexão antes que uma chamada para limpar os identificadores pendentes no servidor seja executada. Se a configuração for < = 1, ações de cancelamento de preparação serão executadas imediatamente no fechamento da instrução preparada. Caso ela seja definida como {@literal >} 1, essas chamadas serão agrupadas em lote para evitar a sobrecarga de uma chamada muito frequente ao sp_unprepare.

Armazenamento em cache de metadados de instruções preparadas

Iniciando com a versão 6.3.0 – versão prévia, o Driver Microsoft JDBC para SQL Server passa a ser compatível com o cache de instruções preparadas. Antes da v6.3.0 – versão prévia, se um usuário executasse uma consulta que já tivesse sido preparada e armazenada no cache, chamar a mesma consulta novamente não resultaria na preparação dela. Agora, o driver pesquisa a consulta no cache, localiza o identificador e executa-o com sp_execute. O cache de metadados de instrução preparado está desabilitado por padrão. Para habilitá-lo, você precisa chamar o seguinte método no objeto de conexão:

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

Por exemplo: connection.setStatementPoolingCacheSize(10)connection.setDisableStatementPooling(false)

Lista das novas APIs introduzidas com essa alteração, para cache de metadados de instruções preparadas

SQLServerConnection

Novo método Descrição
void setDisableStatementPooling(boolean value) Define o pool de instruções como true ou false.
boolean getDisableStatementPooling() Retorna true se o pool de instruções está desabilitado.
void setStatementPoolingCacheSize(int value) Especifica o tamanho do cache de instruções preparadas para esta conexão. Um valor menor que 1 significa nenhum cache.
int getStatementPoolingCacheSize() Retorna o tamanho do cache de instruções preparado para esta conexão. Um valor menor que 1 significa nenhum cache.
int getStatementHandleCacheEntryCount() Retorna o número atual de identificadores de instruções preparadas agrupadas.
boolean isPreparedStatementCachingEnabled() Se o pool de instruções está habilitado ou não para essa conexão.

SQLServerDataSource

Novo método Descrição
void setDisableStatementPooling(boolean disableStatementPooling) Define o pool de instruções como true ou false
boolean getDisableStatementPooling() Retorna true se o pool de instruções está desabilitado.
void setStatementPoolingCacheSize(int statementPoolingCacheSize) Especifica o tamanho do cache de instruções preparadas para esta conexão. Um valor menor que 1 significa nenhum cache.
int getStatementPoolingCacheSize() Retorna o tamanho do cache de instruções preparado para esta conexão. Um valor menor que 1 significa nenhum cache.

Confira também

Melhorando o desempenho e a confiabilidade com o JDBC Driver