Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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