Memorizzazione nella cache dei metadati delle istruzioni preparate per il driver JDBC

Scaricare il driver JDBC

Questo articolo contiene informazioni sulle due modifiche implementate per migliorare le prestazioni del driver.

Invio in batch dell'annullamento della preparazione per le istruzioni preparate

A partire dalla versione 6.1.6-anteprima, è stato implementato un miglioramento delle prestazioni tramite la riduzione dei round trip del server a SQL Server. In precedenza, per ogni query prepareStatement veniva inviata anche una chiamata per l'annullamento della preparazione. Ora il driver esegue l'invio in batch delle query di annullamento della preparazione fino alla soglia "ServerPreparedStatementDiscardThreshold", che ha un valore predefinito di 10.

Nota

Gli utenti possono modificare il valore predefinito con il metodo seguente: setServerPreparedStatementDiscardThreshold(int value)

Un'altra modifica introdotta a partire dalla versione 6.1.6 di anteprima riguarda il fatto che in precedenza il driver chiamava sempre sp_prepexec. Ora il driver chiama sp_executesql per la prima esecuzione di un'istruzione preparata e per il resto esegue sp_prepexec e vi assegna un handle. Per informazioni dettagliate, vedere questo articolo.

A partire dalla versione 11.2, dopo la chiamata iniziale di sp_executesql, il driver può eseguire sp_prepare o sp_prepexec per chiamate aggiuntive, a seconda del valore specificato nella proprietà della stringa di connessione prepareMethod. Per altre informazioni, vedere Impostazione delle proprietà di connessione.

Nota

Gli utenti possono modificare il comportamento predefinito delle versioni precedenti che chiamavano sempre sp_prepexec impostando enablePrepareOnFirstPreparedStatementCall su true usando il metodo setEnablePrepareOnFirstPreparedStatementCall(boolean value)

Elenco delle nuove API introdotte con questa modifica, per l'invio in batch dell'annullamento della preparazione per le istruzioni preparate

SQLServerConnection

Nuovo metodo Descrizione
int getDiscardedServerPreparedStatementCount() Restituisce il numero di azioni di annullamento della preparazione attualmente in sospeso.
void closeUnreferencedPreparedStatementHandles() Impone richieste di annullamento della preparazione per eventuali istruzioni preparate per l'esecuzione e rimosse in sospeso.
boolean getEnablePrepareOnFirstPreparedStatementCall() Restituisce il comportamento per un'istanza di connessione specifica. Se l'impostazione è false, la prima esecuzione chiama sp_executesql e non prepara un'istruzione. Se si verifica una seconda esecuzione, chiama sp_prepare o sp_prepexec e configura un handle dell'istruzione preparata. Le esecuzioni successive chiamano sp_execute. Questo comportamento elimina la necessità di usare sp_unprepare alla chiusura dell'istruzione preparata se l'istruzione viene eseguita una sola volta. L'impostazione predefinita per questa opzione può essere modificata chiamando setDefaultEnablePrepareOnFirstPreparedStatementCall().
void setEnablePrepareOnFirstPreparedStatementCall(boolean value) Specifica il comportamento per un'istanza di connessione specifica. Se il valore è false, la prima esecuzione chiama sp_executesql e non prepara un'istruzione. Se si verifica una seconda esecuzione, chiama sp_prepare o sp_prepexec e configura un handle dell'istruzione preparata. Le esecuzioni successive chiamano sp_execute. Questo comportamento elimina la necessità di usare sp_unprepare alla chiusura dell'istruzione preparata se l'istruzione viene eseguita una sola volta.
int getServerPreparedStatementDiscardThreshold() Restituisce il comportamento per un'istanza di connessione specifica. Questa impostazione consente di controllare il numero di azioni di rimozione (sp_unprepare) in sospeso che possono essere presenti per ogni connessione prima che venga eseguita una chiamata per pulire gli handle in sospeso nel server. Se l'impostazione è <= 1, le azioni di annullamento della preparazione vengono eseguite immediatamente alla chiusura dell'istruzione preparata. Se l'impostazione è {@literal >} 1, le chiamate vengono raggruppate in batch per evitare il sovraccarico dovuto a chiamate troppo frequenti di sp_unprepare. L'impostazione predefinita per questa opzione può essere modificata chiamando getDefaultServerPreparedStatementDiscardThreshold().
void setServerPreparedStatementDiscardThreshold(int value) Specifica il comportamento per un'istanza di connessione specifica. Questa impostazione consente di controllare il numero di azioni di rimozione (sp_unprepare) in sospeso che possono essere presenti per ogni connessione prima che venga eseguita una chiamata per pulire gli handle in sospeso nel server. Se l'impostazione è <= 1, le azioni di annullamento della preparazione vengono eseguite immediatamente alla chiusura dell'istruzione preparata. Se l'impostazione è > 1, le chiamate vengono raggruppate in batch per evitare il sovraccarico dovuto a chiamate troppo frequenti di sp_unprepare.

SQLServerDataSource

Nuovo metodo Descrizione
void setEnablePrepareOnFirstPreparedStatementCall(boolean enablePrepareOnFirstPreparedStatementCall) Se la configurazione è false, la prima esecuzione di un'istruzione preparata chiama sp_executesql e non prepara un'istruzione. Se si verifica una seconda esecuzione, chiama sp_prepare o sp_prepexec e configura un handle dell'istruzione preparata. Le esecuzioni successive chiamano sp_execute. Questo comportamento elimina la necessità di usare sp_unprepare alla chiusura dell'istruzione preparata se l'istruzione viene eseguita una sola volta.
boolean getEnablePrepareOnFirstPreparedStatementCall() Se la configurazione restituisce false, la prima esecuzione di un'istruzione preparata chiama sp_executesql e non prepara un'istruzione. Se si verifica una seconda esecuzione, chiama sp_prepare o sp_prepexec e configura un handle dell'istruzione preparata. Le esecuzioni successive chiamano sp_execute. Questo comportamento elimina la necessità di usare sp_unprepare alla chiusura dell'istruzione preparata se l'istruzione viene eseguita una sola volta.
void setServerPreparedStatementDiscardThreshold(int serverPreparedStatementDiscardThreshold) Questa impostazione consente di controllare il numero di azioni di rimozione (sp_unprepare) in sospeso che possono essere presenti per ogni connessione prima che venga eseguita una chiamata per pulire gli handle in sospeso nel server. Se l'impostazione è <= 1, le azioni di annullamento della preparazione vengono eseguite immediatamente alla chiusura dell'istruzione preparata. Se l'impostazione è {@literal >} 1, le chiamate vengono raggruppate in batch per evitare il sovraccarico dovuto a chiamate troppo frequenti di sp_unprepare
int getServerPreparedStatementDiscardThreshold() Questa impostazione consente di controllare il numero di azioni di rimozione (sp_unprepare) in sospeso che possono essere presenti per ogni connessione prima che venga eseguita una chiamata per pulire gli handle in sospeso nel server. Se l'impostazione è <= 1, le azioni di annullamento della preparazione vengono eseguite immediatamente alla chiusura dell'istruzione preparata. Se l'impostazione è {@literal >} 1, le chiamate vengono raggruppate in batch per evitare il sovraccarico dovuto a chiamate troppo frequenti di sp_unprepare.

Memorizzazione nella cache dei metadati delle istruzioni preparate

A partire dalla versione 6.3.0 di anteprima, Microsoft JDBC Driver per SQL Server supporta la memorizzazione nella cache delle istruzioni preparate. Prima della versione 6.3.0 di anteprima, se si esegue una query già preparata e archiviata nella cache, una nuova chiamata della stessa query non comporta la preparazione. Ora il driver cerca la query nella cache, trova l'handle e avvia l'esecuzione con sp_execute. La memorizzazione nella cache dei metadati delle istruzioni preparate è disabilitata per impostazione predefinita. Per abilitarla, è necessario chiamare il metodo seguente nell'oggetto connessione:

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

Ad esempio: connection.setStatementPoolingCacheSize(10)connection.setDisableStatementPooling(false)

Elenco delle nuove API introdotte con questa modifica, per la memorizzazione nella cache dei metadati delle istruzioni preparate

SQLServerConnection

Nuovo metodo Descrizione
void setDisableStatementPooling(boolean value) Imposta il pooling dell'istruzione su true o false.
boolean getDisableStatementPooling() Restituisce true se il pooling dell'istruzione è disabilitato.
void setStatementPoolingCacheSize(int value) Specifica le dimensioni della cache delle istruzioni preparate per questa connessione. Un valore inferiore a 1 indica nessuna cache.
int getStatementPoolingCacheSize() Restituisce le dimensioni della cache delle istruzioni preparate per questa connessione. Un valore inferiore a 1 indica nessuna cache.
int getStatementHandleCacheEntryCount() Restituisce il numero corrente di handle di istruzioni preparate in pool.
boolean isPreparedStatementCachingEnabled() Indica se il pooling dell'istruzione è abilitato o meno per questa connessione.

SQLServerDataSource

Nuovo metodo Descrizione
void setDisableStatementPooling(boolean disableStatementPooling) Imposta il pooling dell'istruzione su true o false
boolean getDisableStatementPooling() Restituisce true se il pooling dell'istruzione è disabilitato.
void setStatementPoolingCacheSize(int statementPoolingCacheSize) Specifica le dimensioni della cache delle istruzioni preparate per questa connessione. Un valore inferiore a 1 indica nessuna cache.
int getStatementPoolingCacheSize() Restituisce le dimensioni della cache delle istruzioni preparate per questa connessione. Un valore inferiore a 1 indica nessuna cache.

Vedi anche

Uso del driver JDBC per il miglioramento di prestazioni e affidabilità