Überlegungen zur Wiederverwendung einer Sitzung oder Verbindung zwischen mehreren Threads¶
Snowflake-Treiber verwenden zustandsabhängige Verbindungen. Die Wiederverwendung der gleichen Sitzung oder Verbindung zwischen Threads hat mehrere Nachteile. Wenn beispielsweise eine Sitzung initialisiert wird, beginnt sie mit einer Standarddatenbank, einem Standardschema, einer Standardrolle und einer Reihe von Parametern. Eine Verbindung beginnt und beendet eine Sitzung, wodurch eine Eins-zu-Eins-Beziehung zwischen einer Sitzung und einer Verbindung hergestellt wird. Im folgenden Abschnitt werden die allgemeinen Auswirkungen der Wiederverwendung von Verbindungen in mehreren Threads erläutert.
Auswirkungen der Wiederverwendung einer Sitzung oder Verbindung über mehrere Threads hinweg¶
Benutzer von Treibern erstellen häufig Anwendungen mit mehreren Threads. Anstatt separate Sitzungen und Verbindungen für jeden Thread zu erstellen, können Sie versuchen, etwas Aufwand zu sparen, indem Sie eine Sitzung oder Verbindung in verschiedenen Threads wiederverwenden. Beachten Sie, dass dies zu den folgenden unerwünschten Verhaltensweisen führen kann:
Sitzungsstatus
Sitzungen verfolgen die aktuelle Datenbank, das aktuelle Schema und die aktuelle Rolle. Wenn ein Thread diese Werte ändert (z. B. USE DATABASE), kann dies Auswirkungen auf den anderen Thread haben. Diese Auswirkung ist besonders wichtig, da ein Wechsel zu einem anderen Schema mit denselben Tabellen dazu führen könnte, dass ein Thread versehentlich die falsche Tabelle ändert. Außerdem kann sich eine Änderung der Verbindungs- oder Konfigurationsparameter in einer Sitzung auf alle Threads auswirken, die diese Sitzung verwenden.
Transaktionsstatus
Eine Transaktion kann in einer Sitzung beginnen. Wenn mehrere Threads Zugriff auf diese Sitzung haben, kann jeder von ihnen möglicherweise Daten in derselben Transaktion ändern. Dies kann dazu führen, dass die Daten versehentlich beibehalten werden oder verloren gehen, wenn eine Transaktion committed oder zurückgesetzt wird.
Sequenzzähler
Die Treiber verwenden einen Sequenzzähler, um Anfragen zu wiederholen. Da die Sequenzzähler für eine Sitzung global sind, kann die Wiederverwendung einer Sitzung in verschiedenen Threads auch den globalen Sequenzzähler unbeabsichtigt verändern, was zu einer unvorhersehbaren Verhaltensweise bei der Wiederholung von Anfragen führen kann.
Cache für Abfragekontext
Um die Leistung zu verbessern, halten Sitzungen einige interne Informationen in einem treiberspezifischen oder internen Cache fest. Der Cache wird nach jeder Abfrage aktualisiert, sodass die gleichzeitige Ausführung mehrerer Abfragen in einer Sitzung zu einer Datenbeschädigung führen kann.
Letzte Abfrage ID
Die Konnektivität speichert die letzte Abfrage-ID, die dann abgerufen und verwendet werden kann. Wenn zwei Abfragen parallel in verschiedenen Threads laufen, kann eine Racebedingung beeinflussen, welcher Thread die letzte Abfrage-ID setzt.
Empfehlungen für Snowflake¶
Verwenden Sie nach Möglichkeit Verbindungspools.
Wenn Sie Verbindungen über mehrere Threads hinweg wiederverwenden, um häufige Authentifizierungen zu vermeiden, sollten Sie den Einsatz von Verbindungspools in Betracht ziehen. Die Verwendung von Verbindungspools verringert die Anzahl der Authentifizierungsanfragen, da die Sitzung am Ende nicht geschlossen wird, sondern einfach in einen Pool zurückgegeben wird, wo sie für die nächste Verwendung bereitsteht. Selbst bei der Verwendung von Verbindungspools muss Ihre Anwendung darauf achten, keine Parameter zu ändern oder zurückzusetzen, die nur eine bestimmte Abfrage oder eine aktuelle Datenbank betreffen. Außerdem ist die Anwendung dafür verantwortlich, aktive Transaktionen zu comitten oder abzubrechen, bevor eine Verbindung an den Verbindungspool zurückgegeben wird.
Verwenden Sie asynchrone Abfragen mit Bedacht.
Das gleichzeitige Starten mehrerer asynchroner Abfragen auf einer einzigen Verbindung oder das Starten einer synchronen Abfrage, während eine asynchrone Abfrage noch ausgeführt wird, kann zu einer Race Condition führen, die unvorhersehbare Ergebnisse zur Folge haben kann.
Verwenden Sie zusätzliche Optimierungen für die Authentifizierung.
Bestimmte Treiber unterstützen einige oder alle der folgenden Optimierungen, die Sie zur Verbesserung der Authentifizierungsleistung nutzen können:
SSO-Token-Caches
MFA-Token-Caches
Token in TOML-Konfigurationsdateien
Benutzerdefinierte Token-Accessors
Sie sollten in der Treiberdokumentation nachsehen, welche dieser Optionen der Treiber unterstützt.
Deaktivieren Sie die Zwischenspeicherung des Abfragekontexts.
Wenn Sie sich aller Probleme bewusst sind, die mit der Wiederverwendung von Sitzungen und Verbindungen in mehreren Threads verbunden sind, diese aber dennoch nutzen möchten, empfiehlt Snowflake, das Abfrage-Caching zu deaktivieren, indem Sie den Parameter
DisableQueryContextCache
in der Verbindungsdefinition auffalse
einstellen.