Compartilhar via


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

Baixar o JDBC Driver

Este artigo fornece informações sobre duas alterações que aprimoram o desempenho do driver.

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

A partir da versão 6.2, é implementada uma melhoria no desempenho que minimiza as 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 desprepare consultas em lote 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)

Antes da versão 6.2, o driver sempre chama sp_prepexec. Na versão 6.2 e posterior, 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 ela. Para obter mais informações, consulte o cache de metadados PreparedStatement.

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 extras, dependendo do valor especificado na propriedade de 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

ConexãoSQLServer cancelar preparação de lote

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 obterHabilitarPrepararNaPrimeiraChamadaDoPreparedStatement() 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(valor booleano) 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. Quando definido como > 1, essas chamadas são agrupadas em lote para evitar a sobrecarga de chamar sp_unprepare com muita frequência. 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. Quando definido como > 1, essas chamadas são agrupadas em lote para evitar sobrecarga de chamadas sp_unprepare com muita frequência.

SQLServerDataSource execução de lote não preparada

Novo método Descrição
```java void setEnablePrepareOnFirstPreparedStatementCall(boolean enablePrepareOnFirstPreparedStatementCall) // Habilita a preparação na primeira chamada de PreparedStatement ``` 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 fechar a instrução preparada se a instrução for executada apenas uma vez.
boolean obterHabilitarPrepararNaPrimeiraChamadaDoPreparedStatement() 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 fechar a instrução preparada se a instrução for 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. Quando definido como > 1, essas chamadas são agrupadas em lote para evitar a sobrecarga de chamar sp_unprepare com muita frequência
int getServerPreparedStatementDiscardThreshold() // Obtém o limite para descarte de declaração preparada no servidor 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. Quando definido como > 1, essas chamadas são agrupadas em lote para evitar a sobrecarga de chamar sp_unprepare com muita frequência.

Armazenamento em cache de metadados de instruções preparadas

A partir da versão 6.4, o driver JDBC da Microsoft para SQL Server dá suporte ao cache de instrução preparado. Antes da versão 6.4, se uma consulta for executada que já esteja preparada e armazenada no cache, chamar a mesma consulta novamente não exigirá preparação novamente. O driver pesquisa a consulta no cache para encontrar o identificador e executá-lo com sp_execute. O cache de metadados de instrução preparado está desabilitado por padrão. Para habilitá-lo, chame 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

Cache de metadados SQLServerConnection

Novo método Descrição
void setDisableStatementPooling(valor booliano) 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 < 1 significa que não há cache.
int getStatementPoolingCacheSize() Retorna o tamanho do cache de instruções preparado para esta conexão. Um valor < 1 significa que não há cache.
int getStatementHandleCacheEntryCount() Retorna o número atual de identificadores de instruções preparadas agrupadas.
boolean estáCacheHabilitadoParaInstruçãoPreparada() Se o pool de instruções está habilitado ou não para essa conexão.

Cache de metadados 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 < 1 significa que não há cache.
int getStatementPoolingCacheSize() Retorna o tamanho do cache de instruções preparado para esta conexão. Um valor < 1 significa que não há cache.

Confira também

Melhorando o desempenho e a confiabilidade com o driver JDBCDesempenho do parâmetro de instrução preparada