Leistungsindikatoren in SqlClient
Gilt für: .NET Framework .NET Core .NET Standard
Mithilfe von Microsoft.Data.SqlClient-Leistungsindikatoren können Sie den Status Ihrer Anwendung und die von ihr verwendeten Verbindungsressourcen überwachen. Für die Überwachung der Leistungsindikatoren kann der Windows-Leistungsmonitor verwendet werden, und die PerformanceCounter-Klasse im System.Diagnostics-Namespace ermöglicht den programmgesteuerten Zugriff auf diese Indikatoren.
Verfügbare Leistungsindikatoren
Zurzeit sind 14 verschiedene Leistungsindikatoren für Microsoft.Data.SqlClient verfügbar, wie in der folgenden Tabelle beschrieben.
Leistungsindikator | BESCHREIBUNG |
---|---|
HardConnectsPerSecond |
Anzahl der Verbindungen, die pro Sekunde mit einem Datenbankserver hergestellt wurden |
HardDisconnectsPerSecond |
Anzahl der Verbindungen mit einem Datenbankserver, die pro Sekunde getrennt wurden |
NumberOfActiveConnectionPoolGroups |
Anzahl der eindeutigen Verbindungspoolgruppen, die aktiv sind. Dieser Indikator wird von der Anzahl der eindeutigen Verbindungszeichenfolgen gesteuert, die in der Anwendungsdomäne (AppDomain) gefunden werden. |
NumberOfActiveConnectionPools |
Gesamtzahl der Verbindungspools |
NumberOfActiveConnections |
Anzahl der aktiven Verbindungen, die gerade genutzt werden Hinweis: Dieser Leistungsindikator ist standardmäßig nicht aktiviert. Informationen zum Aktivieren dieses Leistungsindikators finden Sie weiter unten unter Aktivieren von Indikatoren, die standardmäßig deaktiviert sind. |
NumberOfFreeConnections |
Anzahl der Verbindungen, die für die Verwendung in den Verbindungspools verfügbar sind Hinweis: Dieser Leistungsindikator ist standardmäßig nicht aktiviert. Informationen zum Aktivieren dieses Leistungsindikators finden Sie weiter unten unter Aktivieren von Indikatoren, die standardmäßig deaktiviert sind. |
NumberOfInactiveConnectionPoolGroups |
Anzahl der eindeutigen Verbindungspoolgruppen, die zum Löschen gekennzeichnet sind. Dieser Indikator wird von der Anzahl der eindeutigen Verbindungszeichenfolgen gesteuert, die in der Anwendungsdomäne (AppDomain) gefunden werden. |
NumberOfInactiveConnectionPools |
Anzahl der inaktiven Verbindungspools, die in letzter Zeit keine Aktivitäten zu verzeichnen hatten und darauf warten, gelöscht zu werden |
NumberOfNonPooledConnections |
Anzahl der aktiven Verbindungen, die sich nicht in einem Pool befinden |
NumberOfPooledConnections |
Anzahl der aktiven Verbindungen, die von der Verbindungspooling-Infrastruktur verwaltet werden |
NumberOfReclaimedConnections |
Anzahl der Verbindungen, die durch die Garbage Collection (automatische Speicherbereinigung) wieder verfügbar gemacht wurden, bei denen die Anwendung weder Close noch Dispose aufgerufen hat. Hinweis: Das nicht explizite Schließen oder Freigeben von Verbindungen beeinträchtigt die Leistung. |
NumberOfStasisConnections |
Anzahl der Verbindungen, die derzeit den Abschluss einer Aktion erwarten und die daher für die Verwendung durch Ihre Anwendung nicht zur Verfügung stehen |
SoftConnectsPerSecond |
Anzahl der aktiven Verbindungen, die aus dem Verbindungspool herausgezogen werden. Hinweis: Dieser Leistungsindikator ist standardmäßig nicht aktiviert. Informationen zum Aktivieren dieses Leistungsindikators finden Sie weiter unten unter Aktivieren von Indikatoren, die standardmäßig deaktiviert sind. |
SoftDisconnectsPerSecond |
Anzahl der aktiven Verbindungen, die an den Verbindungspool zurückgegeben werden Hinweis: Dieser Leistungsindikator ist standardmäßig nicht aktiviert. Informationen zum Aktivieren dieses Leistungsindikators finden Sie weiter unten unter Aktivieren von Indikatoren, die standardmäßig deaktiviert sind. |
Aktivieren von Indikatoren, die standardmäßig deaktiviert sind
Die Leistungsindikatoren NumberOfFreeConnections
, NumberOfActiveConnections
, SoftDisconnectsPerSecond
und SoftConnectsPerSecond
sind standardmäßig deaktiviert. Fügen Sie zum Aktivieren dieser Indikatoren in der Konfigurationsdatei der Anwendung folgende Informationen hinzu:
<system.diagnostics>
<switches>
<add name="ConnectionPoolPerformanceCounterDetail" value="4"/>
<!-- A value of 4 corresponds to System.Diagnostics.TraceLevel.Verbose -->
</switches>
</system.diagnostics>
Abrufen von Leistungsindikatorwerten
Die folgende Konsolenanwendung zeigt, wie Sie in Ihrer Anwendung Leistungsindikatorwerte abrufen können. Damit Informationen für alle Leistungsindikatoren des Microsoft SqlClient-Datenanbieters für SQL Server zurückgegeben werden, müssen die Verbindungen geöffnet und aktiv sein.
Hinweis
In diesem Beispiel wird die AdventureWorks-Beispieldatenbank verwendet. Die im Beispielcode angegebenen Verbindungszeichenfolgen setzen voraus, dass die Datenbank auf dem lokalen Computer installiert und verfügbar ist, und dass Sie Anmeldungen erstellt haben, die mit den in den Verbindungszeichenfolgen angegebenen übereinstimmen. Falls Ihr Server mit den Standardsicherheitseinstellungen konfiguriert ist, die nur die Windows-Authentifizierung zulassen, müssen Sie die SQL Server-Anmeldungen u. U. erst aktivieren. Passen Sie die Verbindungszeichenfolgen an Ihre Umgebung an.
Beispiel
using System;
using Microsoft.Data.SqlClient;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace PerformanceCounterTest
{
class Program
{
PerformanceCounter[] PerfCounters = new PerformanceCounter[10];
SqlConnection connection = new SqlConnection();
static void Main()
{
Program prog = new Program();
// Open a connection and create the performance counters.
prog.connection.ConnectionString =
GetIntegratedSecurityConnectionString();
prog.SetUpPerformanceCounters();
Console.WriteLine("Available Performance Counters:");
// Create the connections and display the results.
prog.CreateConnections();
Console.WriteLine("Press Enter to finish.");
Console.ReadLine();
}
private void CreateConnections()
{
// List the Performance counters.
WritePerformanceCounters();
// Create 4 connections and display counter information.
SqlConnection connection1 = new SqlConnection(
GetIntegratedSecurityConnectionString());
connection1.Open();
Console.WriteLine("Opened the 1st Connection:");
WritePerformanceCounters();
SqlConnection connection2 = new SqlConnection(
GetSqlConnectionStringDifferent());
connection2.Open();
Console.WriteLine("Opened the 2nd Connection:");
WritePerformanceCounters();
SqlConnection connection3 = new SqlConnection(
GetSqlConnectionString());
connection3.Open();
Console.WriteLine("Opened the 3rd Connection:");
WritePerformanceCounters();
SqlConnection connection4 = new SqlConnection(
GetSqlConnectionString());
connection4.Open();
Console.WriteLine("Opened the 4th Connection:");
WritePerformanceCounters();
connection1.Close();
Console.WriteLine("Closed the 1st Connection:");
WritePerformanceCounters();
connection2.Close();
Console.WriteLine("Closed the 2nd Connection:");
WritePerformanceCounters();
connection3.Close();
Console.WriteLine("Closed the 3rd Connection:");
WritePerformanceCounters();
connection4.Close();
Console.WriteLine("Closed the 4th Connection:");
WritePerformanceCounters();
}
private enum ADO_Net_Performance_Counters
{
NumberOfActiveConnectionPools,
NumberOfReclaimedConnections,
HardConnectsPerSecond,
HardDisconnectsPerSecond,
NumberOfActiveConnectionPoolGroups,
NumberOfInactiveConnectionPoolGroups,
NumberOfInactiveConnectionPools,
NumberOfNonPooledConnections,
NumberOfPooledConnections,
NumberOfStasisConnections
// The following performance counters are more expensive to track.
// Enable ConnectionPoolPerformanceCounterDetail in your config file.
// SoftConnectsPerSecond
// SoftDisconnectsPerSecond
// NumberOfActiveConnections
// NumberOfFreeConnections
}
private void SetUpPerformanceCounters()
{
connection.Close();
this.PerfCounters = new PerformanceCounter[10];
string instanceName = GetInstanceName();
Type apc = typeof(ADO_Net_Performance_Counters);
int i = 0;
foreach (string s in Enum.GetNames(apc))
{
this.PerfCounters[i] = new PerformanceCounter();
this.PerfCounters[i].CategoryName = ".NET Data Provider for SqlServer";
this.PerfCounters[i].CounterName = s;
this.PerfCounters[i].InstanceName = instanceName;
i++;
}
}
[DllImport("kernel32.dll", SetLastError = true)]
static extern int GetCurrentProcessId();
private string GetInstanceName()
{
//This works for Winforms apps.
string instanceName =
System.Reflection.Assembly.GetEntryAssembly().GetName().Name;
// Must replace special characters like (, ), #, /, \\
string instanceName2 =
AppDomain.CurrentDomain.FriendlyName.ToString().Replace('(', '[')
.Replace(')', ']').Replace('#', '_').Replace('/', '_').Replace('\\', '_');
// For ASP.NET applications your instanceName will be your CurrentDomain's
// FriendlyName. Replace the line above that sets the instanceName with this:
// instanceName = AppDomain.CurrentDomain.FriendlyName.ToString().Replace('(','[')
// .Replace(')',']').Replace('#','_').Replace('/','_').Replace('\\','_');
string pid = GetCurrentProcessId().ToString();
instanceName = instanceName + "[" + pid + "]";
Console.WriteLine("Instance Name: {0}", instanceName);
Console.WriteLine("---------------------------");
return instanceName;
}
private void WritePerformanceCounters()
{
Console.WriteLine("---------------------------");
foreach (PerformanceCounter p in this.PerfCounters)
{
Console.WriteLine("{0} = {1}", p.CounterName, p.NextValue());
}
Console.WriteLine("---------------------------");
}
private static string GetIntegratedSecurityConnectionString()
{
// To avoid storing the connection string in your code,
// you can retrieve it from a configuration file.
return @"Data Source=.;Integrated Security=True;" +
"Initial Catalog=AdventureWorks";
}
private static string GetSqlConnectionString()
{
// To avoid storing the connection string in your code,
// you can retrieve it from a configuration file.
return @"Data Source=.;User Id=<myUserID>;Password=<myPassword>;" +
"Initial Catalog=AdventureWorks";
}
private static string GetSqlConnectionStringDifferent()
{
// To avoid storing the connection string in your code,
// you can retrieve it from a configuration file.
return @"Initial Catalog=AdventureWorks;Data Source=.;" +
"User Id=<myUserID>;Password=<myPassword>;";
}
}
}