Share via


Gebeurtenistellers in SqlClient

Van toepassing op: .NET .NET Standard

ADO.NET downloaden

Belangrijk

Gebeurtenistellers zijn beschikbaar bij gebruik van .NET Core 3.1 en hoger of .NET Standard 2.1 en hoger. Deze functie is beschikbaar vanaf Microsoft.Data.SqlClientversie 3.0.0.

U kunt gebeurtenistellers gebruiken Microsoft.Data.SqlClient om de status van uw toepassing en de verbindingsbronnen die worden gebruikt, te controleren. Gebeurtenistellers kunnen worden bewaakt door .NET CLI global tools en perfView of kunnen programmatisch toegankelijk zijn met behulp van de EventListener klasse in de System.Diagnostics.Tracing naamruimte.

Beschikbare gebeurtenistellers

Er zijn momenteel 16 verschillende gebeurtenistellers beschikbaar Microsoft.Data.SqlClient , zoals beschreven in de volgende tabel:

Naam Weergavenaam Description
actieve harde verbindingen Werkelijke actieve verbindingen die momenteel zijn gemaakt met servers Het aantal verbindingen dat momenteel is geopend voor databaseservers.
vaste verbinding maken Werkelijke verbindingssnelheid met servers Het aantal verbindingen per seconde dat wordt geopend voor databaseservers.
harde onderbrekingen Werkelijke ontkoppelingsfrequentie van servers Het aantal verbroken verbindingen per seconde naar databaseservers.
actieve zachte verbindingen Actieve verbindingen opgehaald uit de verbindingsgroep Het aantal al geopende verbindingen dat wordt gebruikt vanuit de verbindingspool.
soft-verbindingen Snelheid van verbindingen die zijn opgehaald uit de verbindingsgroep Het aantal verbindingen per seconde dat wordt gebruikt vanuit de verbindingsgroep.
zachte ontkoppelingen Snelheid van verbindingen die zijn geretourneerd naar de verbindingsgroep Het aantal verbindingen per seconde dat wordt geretourneerd naar de verbindingsgroep.
aantal niet-gepoolde verbindingen Aantal verbindingen dat geen gebruikmaakt van groepsgewijze verbindingen Het aantal actieve verbindingen dat niet is gepoold.
aantal gepoolde verbindingen Aantal verbindingen dat wordt beheerd door de verbindingsgroep Het aantal actieve verbindingen dat wordt beheerd door de infrastructuur voor groepsgewijze verbindingen.
aantal groepen met actieve verbindingen Aantal actieve unieke verbindingsreeksen Het aantal unieke verbindingsgroepgroepen dat actief is. Deze teller wordt bepaald door het aantal unieke verbindingsreeks s die in het AppDomain worden gevonden.
aantal-inactieve-verbindingspoolgroepen Aantal unieke verbindingsreeksen die wachten om bijgesneden te worden Het aantal unieke verbindingsgroepgroepen dat is gemarkeerd voor het verwijderen. Deze teller wordt bepaald door het aantal unieke verbindingsreeks s die in het AppDomain worden gevonden.
aantal verbindingsgroepen Aantal actieve verbindingsgroepen Het totale aantal verbindingsgroepen.
aantal inactieve verbindingsgroepen Aantal inactieve verbindingsgroepen Het aantal inactieve verbindingsgroepen dat geen recente activiteit heeft gehad en wacht op verwijdering.
aantal actieve verbindingen Aantal actieve verbindingen Het aantal actieve verbindingen dat momenteel wordt gebruikt.
aantal gratis verbindingen Aantal kant-en-klare verbindingen in de verbindingsgroep Het aantal geopende verbindingen dat beschikbaar is voor gebruik in de verbindingsgroepen.
aantal stasis-verbindingen Aantal verbindingen dat momenteel wacht om gereed te zijn Het aantal verbindingen dat momenteel wacht op voltooiing van een actie en die niet beschikbaar zijn voor gebruik door de toepassing.
aantal vrijgemaakte verbindingen Aantal vrijgemaakte verbindingen van GC Het aantal verbindingen dat is vrijgemaakt via garbage collection waar Close of Dispose niet door de toepassing is aangeroepen. Opmerking Verbindingen niet expliciet sluiten of verwijderen, gaat ten koste van de prestaties.

Waarden van gebeurtenisteller ophalen

Er zijn twee belangrijkste manieren om gebruik te maken van EventCounters: intern of extern. Zie EventCounters gebruiken voor meer informatie.

Out-of-proc gebruiken

In Windows kunt u PerfView en Xperf gebruiken om gegevens van gebeurtenistellers te verzamelen. Zie Gebeurtenistracering inschakelen in SqlClient voor meer informatie. U kunt dotnet-counters en dotnet-trace gebruiken. Dit zijn platformoverschrijdende .NET-hulpprogramma's voor het bewaken en verzamelen van gegevens van gebeurtenistellers.

Voorbeeld van out-of-proc

Met de volgende opdracht worden waarden van SqlClient-gebeurtenistellers eenmaal per seconde verzameld. Door EventCounterIntervalSec=1 door een hogere waarde te vervangen, kan een kleinere trace worden verzameld met minder granulariteit in de tellergegevens.

PerfView /onlyProviders=*Microsoft.Data.SqlClient.EventSource:EventCounterIntervalSec=1 run "<application-Path>"

Met de volgende opdracht worden waarden voor SqlClient-gebeurtenistellers één keer per seconde verzameld.

dotnet-trace collect --process-id <pid> --providers Microsoft.Data.SqlClient.EventSource:0:1:EventCounterIntervalSec=1

Met de volgende opdracht worden waarden voor SqlClient-gebeurtenistellers elke drie seconden bewaakt.

dotnet-counters monitor --counters Microsoft.Data.SqlClient.EventSource -p <process-id> --refresh-interval 3

Met de volgende opdracht worden de waarden van geselecteerde SqlClient-gebeurtenistellers 1 keer per seconde bewaakt.

dotnet-counters monitor --counters Microsoft.Data.SqlClient.EventSource[hard-connects,hard-disconnects] -p <process-id>

In-proc gebruiken

U kunt de tellerwaarden gebruiken via de EventListener-API . Een EventListener is een in-proc manier om gebeurtenissen te gebruiken die zijn geschreven door instanties van een EventSource in uw toepassing. Zie EventListener voor meer informatie.

Voorbeeld van in-proc

Met de volgende voorbeeldcode worden Microsoft.Data.SqlClient.EventSource gebeurtenissen vastgelegd met behulp van EventCounterIntervalSec=1. Deze schrijft de naam van de teller en Mean de bijbehorende waarde voor elke update van de gebeurtenisteller.

Opmerking

U moet de EventCounterIntervalSec eigenschapswaarde opgeven bij het inschakelen van deze gebeurtenis.

using System;
using System.Collections.Generic;
using System.Diagnostics.Tracing;
using System.Linq;

// This listener class will listen for events from the SqlClientEventSource class.
// SqlClientEventSource is an implementation of the EventSource class which gives 
// it the ability to create events.
public class EventCounterListener : EventListener
{
    protected override void OnEventSourceCreated(EventSource eventSource)
    {
        // Only enable events from SqlClientEventSource.
        if (eventSource.Name.Equals("Microsoft.Data.SqlClient.EventSource"))
        {
            var options = new Dictionary<string, string>();
            // define time interval 1 second
            // without defining this parameter event counters will not enabled
            options.Add("EventCounterIntervalSec", "1");
            // enable for the None keyword
            EnableEvents(eventSource, EventLevel.Informational, EventKeywords.None, options);
        }
    }

    // This callback runs whenever an event is written by SqlClientEventSource.
    // Event data is accessed through the EventWrittenEventArgs parameter.
    protected override void OnEventWritten(EventWrittenEventArgs eventData)
    {
        if (eventData.Payload.FirstOrDefault(p => p is IDictionary<string, object> x && x.ContainsKey("Name")) is IDictionary<string, object> counters)
        {
            if (counters.TryGetValue("DisplayName", out object name) && name is string cntName
                && counters.TryGetValue("Mean", out object value) && value is double cntValue)
            {
                // print event counter's name and mean value
                Console.WriteLine($"{cntName}\t\t{cntValue}");
            }
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        // Create a new event listener
        using (var listener = new EventCounterListener())
        {
            string connectionString = "Data Source=localhost; Integrated Security=true";

            for (int i = 0; i < 50; i++)
            {
                // Open a connection
                SqlConnection cnn = new SqlConnection(connectionString);
                cnn.Open();
                // wait for sampling interval happens
                System.Threading.Thread.Sleep(500);
            }
        }
    }
}
Actual active connections currently made to servers           0
Active connections retrieved from the connection pool         26
Number of connections not using connection pooling            0
Number of connections managed by the connection pool          26
Number of active unique connection strings              1
Number of unique connection strings waiting for pruning       0
Number of active connection pools               1
Number of inactive connection pools             0
Number of active connections            26
Number of ready connections in the connection pool            0
Number of connections currently waiting to be ready           0
...

Zie ook