Śledzenie danych w ADO.NET

Microsoft.Data.SqlClient udostępnia śledzenie dostępu do danych za pośrednictwem źródła zdarzeń Microsoft.Data.SqlClient.EventSource. Inne składniki ADO.NET, takie jak dostawcy platformy .NET Framework dla systemów Oracle, OLE DB i ODBC oraz DataSet, mają własne mechanizmy śledzenia.

Śledzenie wywołań interfejsu API dostępu do danych może pomóc zdiagnozować następujące problemy:

  • Niezgodność schematu między programem klienta a bazą danych.

  • Problemy z niedostępnością bazy danych lub biblioteką sieci.

  • Niepoprawny kod SQL niezależnie od tego, czy kodowany w sposób twardy, czy generowany przez aplikację.

  • Niepoprawna logika programowania.

  • Problemy wynikające z interakcji między wieloma składnikami ADO.NET lub między ADO.NET a własnymi składnikami.

Aby obsługiwać różne technologie śledzenia, śledzenie jest rozszerzalne, więc deweloper może śledzić problem na dowolnym poziomie stosu aplikacji. Chociaż śledzenie nie jest tylko funkcją ADO.NET, dostawcy Microsoftu korzystają z uogólnionych interfejsów API do śledzenia i instrumentacji.

Aby uzyskać więcej informacji na temat zbierania śladów Microsoft.Data.SqlClient, zobacz temat Włączanie śledzenia EventSource w SqlClient.

Uzyskiwanie dostępu do informacji diagnostycznych w dzienniku zdarzeń rozszerzonych

Użyj identyfikatorów połączeń Microsoft.Data.SqlClient do korelowania zdarzeń klienta z informacjami diagnostycznymi serwera, takimi jak błędy połączenia, w buforze pierścieniowym łączności i dzienniku zdarzeń rozszerzonych. Aby uzyskać informacje o sposobie odczytywania dziennika zdarzeń rozszerzonych, zobacz Wyświetlanie danych sesji zdarzeń.

W przypadku operacji połączenia Microsoft.Data.SqlClient wysyła identyfikator połączenia klienta podczas wymiany przed logowaniem. Jeśli połączenie nie powiedzie się, poszukaj pola ClientConnectionID w buforze pierścieniowym łączności, aby uzyskać informacje diagnostyczne dotyczące błędu połączenia. Identyfikatory połączeń klienta są rejestrowane w buforze pierścienia tylko wtedy, gdy wystąpi błąd. Jeśli połączenie nie powiedzie się przed wymianą przed logowaniem, serwer nie otrzyma identyfikatora. Identyfikator połączenia klienta to 16-bajtowy identyfikator GUID. Identyfikator połączenia klienta można również znaleźć w danych wyjściowych obiektu docelowego zdarzeń rozszerzonych, jeśli dodasz akcję client_connection_id do zdarzeń w sesji zdarzeń rozszerzonych.

Aby programowo pobrać identyfikator połączenia klienta, użyj polecenia ClientConnectionId.

Identyfikator połączenia jest dostępny dla SqlConnection po pomyślnym nawiązaniu połączenia. Jeśli próba połączenia zakończy się niepowodzeniem, identyfikator może być dostępny za pośrednictwem ClientConnectionId.

Microsoft.Data.SqlClient wysyła również identyfikator działania specyficzny dla wątku dla instrukcji wsadowych i żądań zdalnego wywołania procedury (RPC), gdy źródło zdarzeń jest włączone, a serwer obsługuje nagłówki śledzenia. Aby przechwycić identyfikator działania w sesji zdarzeń rozszerzonych, włącz opcję TRACK_CAUSALITY. W przypadku problemów z wydajnością przy aktywnym połączeniu znajdź identyfikator działania w śladzie klienta, a następnie w danych wyjściowych zdarzeń rozszerzonych. Identyfikator działania zawiera 16-bajtowy identyfikator GUID i cztero bajtowy numer sekwencji. Numer sekwencji wskazuje względną kolejność żądań w wątku. Starsze ustawienie konfiguracji śledzenia dostępu do danych nie konfiguruje źródła zdarzeń Microsoft.Data.SqlClient.

Poniżej znajduje się przykład, który używa Transact-SQL do uruchomienia sesji zdarzeń rozszerzonych, która będzie przechowywana w buforze pierścieniowym i będzie rejestrować identyfikator działania wysyłany z klienta w operacjach RPC i wsadowych.

create event session MySession on server
add event connectivity_ring_buffer_recorded,
add event sql_statement_starting (action (client_connection_id)),
add event sql_statement_completed (action (client_connection_id)),
add event rpc_starting (action (client_connection_id)),
add event rpc_completed (action (client_connection_id))
add target ring_buffer with (track_causality=on)

Zobacz także