Vorbereitetes Caching von Anweisungsmetadaten für den JDBC-Treiber
Dieser Artikel enthält Informationen zu den beiden Änderungen, die implementiert werden, um die Leistung des Treibers zu verbessern.
Rückgängigmachen der Vorbereitung für vorbereitete Anweisungen in Batchverarbeitung
Seit Version 6.1.6-preview wurde eine Verbesserung der Leistung durch Minimieren von Serverroundtrips in SQL Server implementiert. Zuvor wurde für jede prepareStatement-Abfrage auch ein Aufruf zum Rückgängigmachen der Vorbereitung gesendet. Der Treiber führt nun eine Batchverarbeitung von Abfragen für das Rückgängigmachen der Vorbereitung bis zum Schwellenwert „ServerPreparedStatementDiscardThreshold“ (Standardwert 10) durch.
Hinweis
Benutzer können den Standardwert mit der folgenden Methode ändern: setServerPreparedStatementDiscardThreshold(int-Wert)
Eine weitere Änderung, die von 6.1.6-preview eingeführt wurde, ist, dass vor dieser Version der Treiber immer sp_prepexec
aufruft. Nun ruft der Treiber für die erste Ausführung einer vorbereiteten Anweisung sp_executesql
auf, und für den Rest führt er sp_prepexec
aus und weist ihm ein Handle zu. Weitere Informationen finden Sie hier.
Ab 11.2-Version kann der Treiber nach dem ersten Aufruf von sp_executesql
entweder sp_prepare
oder sp_prepexec
für zusätzliche Aufrufe ausführen, je nachdem, welche Werte in der Verbindungszeichenfolgen-Eigenschaft prepareMethod
angegeben sind. Weitere Informationen zum Festlegen der Verbindungseigenschaften finden Sie unter Festlegen von Verbindungseigenschaften.
Hinweis
Benutzer können das Standardverhalten früherer Versionen wiederherstellen, sodass immer sp_prepexec
aufgerufen wird, indem sie enablePrepareOnFirstPreparedStatementCall mithilfe der Methode setEnablePrepareOnFirstPreparedStatementCall(boolescher Wert) auf true festlegen.
Liste der neuen, mit dieser Änderung eingeführten APIs für das Rückgängigmachen der Vorbereitung für vorbereitete Anweisungen in Batchverarbeitung
SQLServerConnection
Methode „New“ | BESCHREIBUNG |
---|---|
int getDiscardedServerPreparedStatementCount() | Gibt die Anzahl der aktuell ausstehenden Aktionen zum Rückgängigmachen der Vorbereitung zurück. |
void closeUnreferencedPreparedStatementHandles() | Erzwingt, dass Anforderungen zum Rückgängigmachen der Vorbereitung für ausstehende verworfene vorbereitete Anweisungen ausgeführt werden. |
boolean getEnablePrepareOnFirstPreparedStatementCall() | Gibt das Verhalten einer bestimmten Verbindungsinstanz an. „false“ gibt an, dass durch die erste Ausführung sp_executesql aufgerufen und keine Anweisung vorbereitet wird. Wenn eine zweite Ausführung erfolgt, wird sp_prepare oder sp_prepexec aufgerufen und tatsächlich ein Handle für vorbereitete Anweisungen eingerichtet. Bei späteren Ausführungen wird sp_execute aufgerufen. Dadurch ist sp_unprepare nicht mehr für den Abschluss einer vorbereiteten Anweisung erforderlich, falls diese nur einmal ausgeführt wird. Der Standardwert für diese Option kann durch Aufrufen von setDefaultEnablePrepareOnFirstPreparedStatementCall() geändert werden. |
void setEnablePrepareOnFirstPreparedStatementCall(boolescher Wert) | Mit dieser Methode geben Sie das Verhalten einer bestimmten Verbindungsinstanz an. Der Wert „false“ gibt an, dass durch die erste Ausführung sp_executesql aufgerufen und keine Anweisung vorbereitet wird. Wenn eine zweite Ausführung erfolgt, wird sp_prepare oder sp_prepexec aufgerufen und tatsächlich ein Handle für vorbereitete Anweisungen eingerichtet. Bei späteren Ausführungen wird sp_execute aufgerufen. Dadurch ist sp_unprepare nicht mehr für den Abschluss einer vorbereiteten Anweisung erforderlich, falls diese nur einmal ausgeführt wird. |
int getServerPreparedStatementDiscardThreshold() | Gibt das Verhalten einer bestimmten Verbindungsinstanz an. Mit dieser Einstellung steuern Sie, wie viele ausstehende Verwerfungsaktionen (sp_unprepare ) pro Verbindung vorhanden sein dürfen, bevor ein Aufruf zum Bereinigen der ausstehenden Handles auf dem Server ausgeführt wird. Wenn diese Einstellung <= 1 ist, werden Aktionen zum Rückgängigmachen der Vorbereitung sofort nach Abschluss der vorbereiteten Anweisung ausgeführt. Bei Festlegung auf {@literal >} 1 werden diese Aufrufe in einem Batch zusammengefasst, um den Aufwand eines zu häufigen Aufrufs von sp_unprepare zu vermeiden. Der Standardwert für diese Option kann durch Aufrufen von getDefaultServerPreparedStatementDiscardThreshold() geändert werden. |
void setServerPreparedStatementDiscardThreshold(int value) | Mit dieser Methode geben Sie das Verhalten einer bestimmten Verbindungsinstanz an. Mit dieser Einstellung steuern Sie, wie viele ausstehende Verwerfungsaktionen (sp_unprepare ) pro Verbindung vorhanden sein dürfen, bevor ein Aufruf zum Bereinigen der ausstehenden Handles auf dem Server ausgeführt wird. Wenn diese Einstellung <= 1 ist, werden Aktionen zum Rückgängigmachen der Vorbereitung sofort nach Abschluss der vorbereiteten Anweisung ausgeführt. Bei Festlegung auf > 1 werden diese Aufrufe in einem Batch zusammengefasst, um den Aufwand eines zu häufigen Aufrufs von sp_unprepare zu vermeiden. |
SQLServerDataSource
Methode „New“ | BESCHREIBUNG |
---|---|
void setEnablePrepareOnFirstPreparedStatementCall(boolesch enablePrepareOnFirstPreparedStatementCall) | Wenn diese Konfiguration den Wert „false“ hat, ruft die erste Ausführung einer vorbereiteten Anweisung sp_executesql auf und bereitet keine Anweisung vor. Wenn eine zweite Ausführung erfolgt, wird sp_prepare oder sp_prepexec aufgerufen und tatsächlich ein Handle für vorbereitete Anweisungen eingerichtet. Bei späteren Ausführungen wird sp_execute aufgerufen. Dadurch ist sp_unprepare nicht mehr für den Abschluss einer vorbereiteten Anweisung erforderlich, falls diese nur einmal ausgeführt wird. |
boolean getEnablePrepareOnFirstPreparedStatementCall() | Wenn diese Konfiguration „false“ zurückgibt, ruft die erste Ausführung einer vorbereiteten Anweisung sp_executesql auf und bereitet keine Anweisung vor. Wenn eine zweite Ausführung erfolgt, wird sp_prepare oder sp_prepexec aufgerufen und tatsächlich ein Handle für vorbereitete Anweisungen eingerichtet. Bei späteren Ausführungen wird sp_execute aufgerufen. Dadurch ist sp_unprepare nicht mehr für den Abschluss einer vorbereiteten Anweisung erforderlich, falls diese nur einmal ausgeführt wird. |
void setServerPreparedStatementDiscardThreshold(int serverPreparedStatementDiscardThreshold) | Mit dieser Einstellung steuern Sie, wie viele ausstehende Verwerfungsaktionen (sp_unprepare ) pro Verbindung vorhanden sein dürfen, bevor ein Aufruf zum Bereinigen der ausstehenden Handles auf dem Server ausgeführt wird. Wenn diese Einstellung <= 1 ist, werden Aktionen zum Rückgängigmachen der Vorbereitung sofort nach Abschluss der vorbereiteten Anweisung ausgeführt. Bei Festlegung auf {@literal >} 1 werden diese Aufrufe in einem Batch zusammengefasst, um den Aufwand eines zu häufigen Aufrufs von sp_unprepare zu vermeiden. |
int getServerPreparedStatementDiscardThreshold() | Mit dieser Einstellung steuern Sie, wie viele ausstehende Verwerfungsaktionen (sp_unprepare ) pro Verbindung vorhanden sein dürfen, bevor ein Aufruf zum Bereinigen der ausstehenden Handles auf dem Server ausgeführt wird. Wenn diese Einstellung <= 1 ist, werden Aktionen zum Rückgängigmachen der Vorbereitung sofort nach Abschluss der vorbereiteten Anweisung ausgeführt. Bei Festlegung auf {@literal >} 1 werden diese Aufrufe in einem Batch zusammengefasst, um den Aufwand eines zu häufigen Aufrufs von sp_unprepare zu vermeiden. |
Zwischenspeicherung von Metadaten einer vorbereiteten Anweisung
Ab Version 6.3.0-preview unterstützt der Microsoft JDBC-Treiber für SQL Server das Zwischenspeichern vorbereiteter Anweisungen. Wenn vor Version 6.3.0-preview eine Abfrage ausgeführt wurde, die bereits vorbereitet war und im Cache gespeichert wurde, führte der erneute Aufruf derselben Abfrage nicht zu deren Vorbereitung. Nun sucht der Treiber die Abfrage im Cache, findet das Handle und führt es mit sp_execute
aus.
Das Zwischenspeichern von Metadaten zu vorbereiteten Anweisungen ist standardmäßig deaktiviert. Um es zu aktivieren, müssen Sie die folgende Methode für das Verbindungsobjekt aufrufen:
setStatementPoolingCacheSize(int value) //value is the desired cache size (any value bigger than 0)
setDisableStatementPooling(boolean value) //false allows the caching to take place
Beispiel: connection.setStatementPoolingCacheSize(10)
connection.setDisableStatementPooling(false)
.
Liste der neuen, mit dieser Änderung eingeführten APIs für das Zwischenspeichern von Metadaten zu vorbereiteten Anweisungen
SQLServerConnection
Methode „New“ | BESCHREIBUNG |
---|---|
void setDisableStatementPooling(boolescher Wert) | Diese Methode legt das Anweisungspooling auf TRUE oder FALSE fest. |
boolean getDisableStatementPooling() | Gibt „true“ zurück, wenn das Anweisungspooling deaktiviert ist. |
void setStatementPoolingCacheSize(int-Wert) | Legt die Größe des Caches für vorbereitete Anweisungen für diese Verbindung fest. Bei einem kleineren Wert als 1 wird kein Cache verwendet. |
int getStatementPoolingCacheSize() | Sie gibt die Größe des Prepared Statement-Caches für diese Verbindung zurück. Bei einem kleineren Wert als 1 wird kein Cache verwendet. |
int getStatementHandleCacheEntryCount() | Gibt die aktuelle Anzahl von Handles für vorbereitete Anweisungen zurück, die in einem Pool zusammengefasst sind. |
boolean isPreparedStatementCachingEnabled() | Gibt zurück, ob für diese Verbindung Anweisungspooling aktiviert ist |
SQLServerDataSource
Methode „New“ | BESCHREIBUNG |
---|---|
void setDisableStatementPooling(boolesch disableStatementPooling) | Legt das Anweisungspooling auf „true“ oder „false“ fest. |
boolean getDisableStatementPooling() | Gibt „true“ zurück, wenn das Anweisungspooling deaktiviert ist. |
void setStatementPoolingCacheSize(int statementPoolingCacheSize) | Legt die Größe des Caches für vorbereitete Anweisungen für diese Verbindung fest. Bei einem kleineren Wert als 1 wird kein Cache verwendet. |
int getStatementPoolingCacheSize() | Sie gibt die Größe des Prepared Statement-Caches für diese Verbindung zurück. Bei einem kleineren Wert als 1 wird kein Cache verwendet. |
Weitere Informationen
Verbessern von Leistung und Zuverlässigkeit mit dem JDBC-Treiber