Metadados de instrução em cache preparados para o JDBC Driver
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