Udostępnij za pośrednictwem


Włączanie wielu aktywnych zestawów wyników

Wiele aktywnych zestawów wyników (MARS) to funkcja, która współdziała z programem SQL Server w celu umożliwienia wykonywania wielu partii w jednym połączeniu. Gdy usługa MARS jest włączona do użytku z programem SQL Server, każdy używany obiekt polecenia dodaje sesję do połączenia.

Uwaga

Jedna sesja MARS otwiera jedno połączenie logiczne dla usługi MARS do użycia, a następnie jedno połączenie logiczne dla każdego aktywnego polecenia.

Włączanie i wyłączanie usługi MARS w parametrach połączenia

Uwaga

Poniższe parametry połączenia używają przykładowej bazy danych AdventureWorks dołączonej do programu SQL Server. Podane parametry połączenia zakładają, że baza danych jest zainstalowana na serwerze o nazwie MSSQL1. Zmodyfikuj parametry połączenia zgodnie z potrzebami dla środowiska.

Funkcja MARS jest domyślnie wyłączona. Można ją włączyć, dodając "MultipleActiveResultSets=True" parę słów kluczowych do parametry połączenia. Wartość "True" jest jedyną prawidłową wartością umożliwiającą włączenie usługi MARS. W poniższym przykładzie pokazano, jak nawiązać połączenie z wystąpieniem programu SQL Server i jak określić, że usługa MARS powinna być włączona.

Dim connectionString As String = "..." & _
    "MultipleActiveResultSets=True"
string connectionString = "..." +
    "MultipleActiveResultSets=True";

Możesz wyłączyć usługę MARS, dodając "MultipleActiveResultSets=False" parę słów kluczowych do parametry połączenia. Wartość "Fałsz" jest jedyną prawidłową wartością wyłączającą usługę MARS.

Uwagi specjalne dotyczące korzystania z usługi MARS

Ogólnie rzecz biorąc, istniejące aplikacje nie powinny wymagać modyfikacji, aby korzystać z połączenia z obsługą usługi MARS. Jeśli jednak chcesz używać funkcji MARS w aplikacjach, zapoznaj się z poniższymi specjalnymi zagadnieniami.

Przeplatanie instrukcji

Operacje MARS są wykonywane synchronicznie na serwerze. Przeplatanie instrukcji SELECT i BULK INSERT jest dozwolone. Jednak instrukcje języka manipulowania danymi (DML) i języka definicji danych (DDL) są wykonywane niepodziealnie. Wszystkie instrukcje próbujące wykonać podczas wykonywania partii niepodzielnej są blokowane. Równoległe wykonywanie na serwerze nie jest funkcją MARS.

Jeśli dwie partie są przesyłane w ramach połączenia MARS, jedna z nich zawierająca instrukcję SELECT, druga zawierająca instrukcję DML, DML może rozpocząć wykonywanie w ramach wykonywania instrukcji SELECT. Jednak instrukcja DML musi zostać uruchomiona w celu ukończenia, zanim instrukcja SELECT będzie mogła poczynić postępy. Jeśli obie instrukcje działają w ramach tej samej transakcji, wszelkie zmiany wprowadzone przez instrukcję DML po rozpoczęciu wykonywania instrukcji SELECT nie są widoczne dla operacji odczytu.

Instrukcja WAITFOR wewnątrz instrukcji SELECT nie zwraca transakcji podczas oczekiwania, czyli do momentu utworzenia pierwszego wiersza. Oznacza to, że żadne inne partie nie mogą być wykonywane w ramach tego samego połączenia, gdy instrukcja WAITFOR czeka.

Pamięć podręczna sesji MARS

Po otwarciu połączenia z włączoną usługą MARS zostanie utworzona sesja logiczna, która dodaje dodatkowe obciążenie. Aby zminimalizować obciążenie i zwiększyć wydajność, klient SqlClient buforuje sesję MARS w ramach połączenia. Pamięć podręczna zawiera co najwyżej 10 sesji MARS. Ta wartość nie jest regulowana przez użytkownika. Jeśli limit sesji zostanie osiągnięty, zostanie utworzona nowa sesja — błąd nie zostanie wygenerowany. Pamięć podręczna i zawarte w nim sesje są na połączenie; nie są one współużytkowane między połączeniami. Po wydaniu sesji zostanie ona zwrócona do puli, chyba że osiągnięto górny limit puli. Jeśli pula pamięci podręcznej jest pełna, sesja zostanie zamknięta. Sesje usługi MARS nie wygasają. Są one czyszczone tylko wtedy, gdy obiekt połączenia jest usuwany. Pamięć podręczna sesji MARS nie jest wstępnie załadowana. Jest ładowany, ponieważ aplikacja wymaga więcej sesji.

Bezpieczeństwo wątkowe

Operacje MARS nie są bezpieczne wątkowo.

Pula połączeń

Połączenia z obsługą usługi MARS są w puli jak każde inne połączenie. Jeśli aplikacja otworzy dwa połączenia, jedna z włączoną usługą MARS i jedna z wyłączoną usługą MARS, dwa połączenia znajdują się w oddzielnych pulach. Aby uzyskać więcej informacji, zobacz Sql Server Connection Pooling (ADO.NET).

Środowisko wykonywania wsadowego programu SQL Server

Po otwarciu połączenia definiowane jest domyślne środowisko. To środowisko jest następnie kopiowane do logicznej sesji MARS.

Środowisko wykonywania wsadowego obejmuje następujące składniki:

  • Ustawianie opcji (na przykład ANSI_NULLS, DATE_FORMAT, LANGUAGE, TEXTSIZE)

  • Kontekst zabezpieczeń (rola użytkownika/aplikacji)

  • Kontekst bazy danych (bieżąca baza danych)

  • Zmienne stanu wykonywania (na przykład @@ERROR, @@ROWCOUNT, @@FETCH_STATUS @@IDENTITY)

  • Tabele tymczasowe najwyższego poziomu

W przypadku usługi MARS domyślne środowisko wykonywania jest skojarzone z połączeniem. Każda nowa partia, która rozpoczyna wykonywanie w ramach danego połączenia, otrzymuje kopię środowiska domyślnego. Za każdym razem, gdy kod jest wykonywany w ramach danej partii, wszystkie zmiany wprowadzone w środowisku są ograniczone do określonej partii. Po zakończeniu wykonywania ustawienia wykonywania są kopiowane do środowiska domyślnego. W przypadku pojedynczej partii wykonującej kilka poleceń, które mają być wykonywane sekwencyjnie w ramach tej samej transakcji, semantyka jest taka sama jak te uwidocznione przez połączenia obejmujące starszych klientów lub serwerów.

Równoległego

Usługa MARS nie jest przeznaczona do usuwania wszystkich wymagań dotyczących wielu połączeń w aplikacji. Jeśli aplikacja wymaga rzeczywistego równoległego wykonywania poleceń na serwerze, należy użyć wielu połączeń.

Rozważmy na przykład następujący scenariusz. Tworzone są dwa obiekty poleceń: jeden do przetwarzania zestawu wyników, a drugi do aktualizowania danych; mają wspólne połączenie za pośrednictwem usługi MARS. W tym scenariuszu element Transaction.Commit Aktualizacja kończy się niepowodzeniem, dopóki wszystkie wyniki nie będą odczytywane w pierwszym obiekcie polecenia, co daje następujący wyjątek:

Komunikat: kontekst transakcji używany przez inną sesję.

Źródło: .NET SqlClient Dostawca danych

Oczekiwano: (null)

Odebrano: System.Data.SqlClient.SqlException

Istnieją trzy opcje obsługi tego scenariusza:

  1. Uruchom transakcję po utworzeniu czytnika, aby nie była częścią transakcji. Każda aktualizacja staje się własną transakcją.

  2. Zatwierdź całą pracę po zamknięciu czytnika. Jest to możliwe w przypadku znacznej partii aktualizacji.

  3. Nie używaj usługi MARS; Zamiast tego należy użyć oddzielnego połączenia dla każdego obiektu polecenia, jak wcześniej mars.

Wykrywanie obsługi usługi MARS

Aplikacja może sprawdzić obsługę usługi MARS, odczytując SqlConnection.ServerVersion wartość. Liczba główna powinna być 9 dla programu SQL Server 2005 i 10 dla programu SQL Server 2008.

Zobacz też