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:
Uruchom transakcję po utworzeniu czytnika, aby nie była częścią transakcji. Każda aktualizacja staje się własną transakcją.
Zatwierdź całą pracę po zamknięciu czytnika. Jest to możliwe w przypadku znacznej partii aktualizacji.
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.