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 com prepareStatement, também era enviada uma chamada para unprepare. Agora, o driver agrupa em lote as consultas unprepare até atingir 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
Agrupamento de unprepare de 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 falso, a primeira execução chama sp_executesql e não prepara uma instrução SQL. 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 operações de descarte pendentes (sp_unprepare) pode haver por conexão antes que seja executada uma chamada para limpar os handles pendentes no servidor. 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 operações de descarte pendentes (sp_unprepare) pode haver por conexão antes que uma chamada para limpar os handles 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. |
Agrupamento de unprepare de 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. 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() | 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 localizar o identificador e executa-o 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(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(valor int) | 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 isPreparedStatementCachingEnabled() | 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. |