Aktivieren von MARS (Multiple Active Result Sets)
Aktualisiert: November 2007
MARS (Multiple Active Result Sets) ist ein Feature, das mit SQL Server 2005 verwendet werden kann und das Ausführen mehrerer Batches über eine einzelne Verbindung ermöglicht. Mithilfe von SqlDataReader-Objekten kann nur auf mehrere Resultsets vorheriger SQL Server-Versionen zugegriffen werden, wenn zuvor mit jedem SqlCommand-Objekt ein separates SqlConnection-Objekt verwendet wurde. Wenn MARS jedoch für die Verwendung mit SQL Server 2005 aktiviert wird, fügen die einzelnen verwendeten Befehlsobjekte der Verbindung eine Sitzung hinzu.
Hinweis: |
---|
Eine einzelne MARS-Sitzung öffnet genau eine logische Verbindung zur Verwendung durch MARS und dann jeweils eine logische Verbindung pro aktiven Befehl. |
Aktivieren und Deaktivieren von MARS in der Verbindungszeichenfolge
Hinweis: |
---|
In den folgenden Verbindungszeichenfolgen wird die in SQL Server 2005 enthaltene AdventureWorks-Beispieldatenbank verwendet. In den bereitgestellten Verbindungszeichenfolgen wird davon ausgegangen, dass die Datenbank auf dem Server MSSQL1 installiert ist. Ändern Sie die Verbindungszeichenfolge entsprechend der Umgebung. |
Das MARS-Feature ist in der Standardeinstellung deaktiviert. Es kann durch Hinzufügen des Schlüsselwortpaars "MultipleActiveResultSets=True" zur Verbindungszeichenfolge aktiviert werden. "True" ist der einzige gültige Wert zum Aktivieren von MARS. Im folgenden Beispiel wird veranschaulicht, wie eine Verbindung mit einer Instanz von SQL Server hergestellt wird und wie angegeben wird, dass MARS aktiviert werden soll.
Dim connectionString As String = "Data Source=MSSQL1;" & _
"Initial Catalog=AdventureWorks;Integrated Security=SSPI" & _
"MultipleActiveResultSets=True"
string connectionString = "Data Source=MSSQL1;" +
"Initial Catalog=AdventureWorks;Integrated Security=SSPI" +
"MultipleActiveResultSets=True";
MARS kann durch Hinzufügen des Schlüsselwortpaars "MultipleActiveResultSets=False" zur Verbindungszeichenfolge deaktiviert werden. "False" ist der einzige gültige Wert zum Deaktivieren von MARS. In der folgenden Verbindungszeichenfolge wird die Deaktivierung von MARS veranschaulicht.
Dim connectionString As String = "Data Source=MSSQL1;" & _
"Initial Catalog=AdventureWorks;Integrated Security=SSPI" & _
"MultipleActiveResultSets=False"
string connectionString = "Data Source=MSSQL1;" +
"Initial Catalog=AdventureWorks;Integrated Security=SSPI" +
"MultipleActiveResultSets=False";
Besondere Überlegungen bei der Verwendung von MARS
Im Allgemeinen sollten vorhandene Anwendungen für die Verwendung einer MARS-aktivierten Verbindung keine Änderungen erfordern. Wenn Sie in den Anwendungen jedoch MARS-Features verwenden möchten, sollten Sie die folgenden Besonderheiten berücksichtigen.
Überlappen von Anweisungen
MARS-Vorgänge werden auf dem Server synchron ausgeführt. Die Überlappung der SELECT-Anweisung und der BULK INSERT-Anweisung ist zulässig. Die Anweisungen der Datenbearbeitungssprache (Data Manipulation Language, DML) und der Datendefinitionssprache (Data Definition Language, DDL) werden atomar ausgeführt. Alle Statements, die während der Ausführung eines atomaren Batches ausgeführt werden sollen, werden blockiert. Bei der Parallelausführung auf dem Server handelt es sich nicht um ein MARS-Feature.
Wenn zwei Batches mithilfe einer MARS-Verbindung übertragen werden, von denen einer eine SELECT-Anweisung und einer eine DML-Anweisung enthält, kann die DML-Anweisung während der Ausführung der SELECT-Anweisung ausgeführt werden. Die DML-Anweisung muss jedoch vollständig ausgeführt werden, damit die SELECT-Anweisung fortgesetzt werden kann. Wenn beide Anweisungen in derselben Transaktion ausgeführt werden, sind Änderungen, die nach dem Starten der Ausführung der SELECT-Anweisung vorgenommen wurden, für den Lesevorgang nicht sichtbar.
Eine WAITFOR-Anweisung in einer SELECT-Anweisung wird nicht an die Transaktion übergeben, während diese wartet, d. h., bis die erste Zeile erstellt wurde. Dies bedeutet, dass während des Wartens der WAITFOR-Anweisung keine anderen Batches in derselben Verbindung ausgeführt werden können.
MARS-Sitzungscache
Wenn eine Verbindung mit aktiviertem MARS offen ist, wird eine logische Sitzung erstellt, die zusätzlichen Aufwand erfordert. Um den Aufwand zu minimieren und die Leistungsfähigkeit zu erhöhen, führt SqlClient eine Zwischenspeicherung der MARS-Sitzung in einer Verbindung durch. Der Cache kann maximal 10 MARS-Sitzungen enthalten. Dieser Wert kann nicht vom Benutzer geändert werden. Wenn die maximale Sitzungsanzahl erreicht ist und eine neue Sitzung erstellt wird, wird kein Fehler generiert. Der Cache und die darin enthaltenen Sitzungen richten sich jeweils nach der Verbindung. Sie werden nicht von mehreren Verbindungen gemeinsam genutzt. Wenn eine Sitzung freigegeben wird, wird sie an den Pool zurückgegeben, sofern die obere Grenze des Pools erreicht wurde. Wenn der Cachepool voll ist, wird die Sitzung beendet. Die Gültigkeit von MARS-Sitzungen läuft nicht ab. Sie werden lediglich bereinigt, wenn das Verbindungsobjekt freigegeben wird. Der Cache der MARS-Sitzung wird nicht vorab geladen. Dies erfolgt, wenn die Anwendung weitere Sitzungen benötigt.
Threadsicherheit
MARS-Vorgänge sind nicht threadsicher.
Verbindungspooling
MARS-aktivierte Verbindungen werden genau wie andere Verbindungen in einem Pool zusammengefasst. Wenn eine Anwendung zwei Verbindungen öffnet, wobei MARS bei einer aktiviert ist und bei der anderen deaktiviert ist, befinden sich die beiden Verbindungen in separaten Pools. Weitere Informationen finden Sie unter SQL Server-Verbindungspooling (ADO.NET).
SQL Server-Batchausführungsumgebung
Beim Öffnen einer Verbindung wird eine Standardumgebung definiert. Diese Umgebung wird anschließend in eine logische MARS-Sitzung kopiert.
Die Batchausführungsumgebung enthält die folgenden Komponenten:
Gruppenoptionen (z. B. ANSI_NULLS, DATE_FORMAT, LANGUAGE, TEXTSIZE)
Sicherheitskontext (Benutzerrolle/Anwendungsrolle)
Datenbankkontext (aktuelle Datenbank)
Ausführungszustandsvariablen (z. B. @@ERROR, @@ROWCOUNT, @@FETCH_STATUS, @@IDENTITY)
Temporäre Tabellen auf oberster Ebene
In SQL Server 2000 und früheren Versionen wird für alle Batches, die mit derselben Verbindung ausgeführt werden, dieselbe Batchumgebung verwendet. Änderungen, die von einem Batch an der Batchumgebung vorgenommen wurden, sind für alle nachfolgenden Batches sichtbar.
Mit MARS wird einer Verbindung eine Standardausführungsumgebung zugeordnet. Jeder neue Batch, der mit einer angegebenen Verbindung ausgeführt wird, erhält eine Kopie der Standardumgebung. Bei jeder Ausführung von Code unter einem angegebenen Batch beschränken sich alle an der Umgebung vorgenommenen Änderungen auf den bestimmten Batch. Nachdem die Ausführung beendet ist, werden die Ausführungseinstellungen in die Standardumgebung kopiert. Bei einem einzelnen Batch, der verschiedene nacheinander mit derselben Verbindung auszuführende Befehle ausgibt, entspricht die Semantik genau derjenigen, die von Verbindungen unter Einbeziehung früherer Clients oder Server verfügbar gemacht wird.
Parallelausführung
MARS wurde nicht entwickelt, um alle Anforderungen für mehrere Verbindungen in einer Anwendung zu entfernen. Wenn eine Anwendung eine tatsächliche Parallelausführung von Befehlen für einen Server erfordert, sollten mehrere Verbindungen verwendet werden.
Betrachten Sie beispielsweise das folgende Szenario: Es werden zwei Befehlsobjekte erstellt, wobei ein Objekt zum Verarbeiten eines Resultsets und das andere Objekt zum Aktualisieren von Daten verwendet wird. Diese verwenden eine gemeinsame Verbindung über MARS. Bei diesem Szenario kann Transaction.Commit erst erfolgreich ausgeführt werden, nachdem alle Ergebnisse des ersten Befehlsobjekts gelesen wurden. Daher wird eine entsprechende Ausnahme ausgelöst:
Es wird eine Meldung angezeigt. Diese gibt an, dass der Transaktionskontext von einer anderen Sitzung verwendet wird.
Zum Behandeln dieses Szenarien bestehen drei Möglichkeiten:
Starten Sie die Transaktion, nachdem der Reader erstellt wurde, damit dieser keinen Bestandteil der Transaktion darstellt. Jede Aktualisierung wird zu einer eigenen Transaktion.
Führen Sie alle Aufgaben aus, nachdem der Reader geschlossen wurde. Dadurch kann eine Vielzahl von Aktualisierungen entstehen.
Verwenden Sie nicht MARS, sondern für jedes Befehlsobjekt eine separate Verbindung (wie vor der Verwendung von MARS).
Ermitteln der MARS-Unterstützung
Durch Lesen des SqlConnection.ServerVersion-Werts kann eine Anwendung überprüfen, ob MARS unterstützt wird. Für SQL Server 2005 muss die Angabe für den Hauptwert 9 lauten.