Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Gäller för: .NET Framework
Du kan använda Microsoft.Data.SqlClient prestandaräknare för att övervaka statusen för ditt program och de anslutningsresurser som används. Prestandaräknare kan övervakas med hjälp av Windows Prestandaövervakare eller kan nås programmatiskt med hjälp av PerformanceCounter klassen i System.Diagnostics namnområdet.
Tillgängliga prestandaräknare
För närvarande finns det 14 olika prestandaräknare tillgängliga för Microsoft.Data.SqlClient enligt beskrivningen i följande tabell.
| Prestandaräknare | Description |
|---|---|
HardConnectsPerSecond |
Antalet anslutningar per sekund som görs till en databasserver. |
HardDisconnectsPerSecond |
Antalet frånkopplingar per sekund som görs till en databasserver. |
NumberOfActiveConnectionPoolGroups |
Antalet unika anslutningspoolgrupper som är aktiva. Den här räknaren styrs av antalet unika anslutningssträng som finns i AppDomain. |
NumberOfActiveConnectionPools |
Det totala antalet anslutningspooler. |
NumberOfActiveConnections |
Antalet aktiva anslutningar som används för närvarande. Obs! Den här prestandaräknaren är inte aktiverad som standard. Information om hur du aktiverar den här prestandaräknaren finns i Aktivera off-by-default-räknare. |
NumberOfFreeConnections |
Antalet anslutningar som är tillgängliga för användning i anslutningspoolerna. Obs! Den här prestandaräknaren är inte aktiverad som standard. Information om hur du aktiverar den här prestandaräknaren finns i Aktivera off-by-default-räknare. |
NumberOfInactiveConnectionPoolGroups |
Antalet unika anslutningspoolgrupper som har markerats för rensning. Den här räknaren styrs av antalet unika anslutningssträng som finns i AppDomain. |
NumberOfInactiveConnectionPools |
Antalet inaktiva anslutningspooler som inte har haft någon nyligen genomförd aktivitet och som väntar på att tas bort. |
NumberOfNonPooledConnections |
Antalet aktiva anslutningar som inte är poolade. |
NumberOfPooledConnections |
Antalet aktiva anslutningar som hanteras av infrastrukturen för anslutningspooler. |
NumberOfReclaimedConnections |
Antalet anslutningar som har återtagits via skräpinsamling där Close programmet anropade eller Dispose inte anropades.
Observera Att inte uttryckligen stänga eller ta bort anslutningar skadar prestandan. |
NumberOfStasisConnections |
Antalet anslutningar som väntar på att slutföra en åtgärd och som därför inte är tillgängliga för användning av ditt program. |
SoftConnectsPerSecond |
Antalet aktiva anslutningar som hämtas från anslutningspoolen. Obs! Den här prestandaräknaren är inte aktiverad som standard. Information om hur du aktiverar den här prestandaräknaren finns i Aktivera off-by-default-räknare. |
SoftDisconnectsPerSecond |
Antalet aktiva anslutningar som returneras till anslutningspoolen. Obs! Den här prestandaräknaren är inte aktiverad som standard. Information om hur du aktiverar den här prestandaräknaren finns i Aktivera off-by-default-räknare. |
Aktivera räknare som är avstängda som standard
Prestandaräknarna NumberOfFreeConnections, NumberOfActiveConnections, SoftDisconnectsPerSecondoch SoftConnectsPerSecond är inaktiverade som standard. Lägg till följande information i programmets konfigurationsfil för att aktivera dem:
<system.diagnostics>
<switches>
<add name="ConnectionPoolPerformanceCounterDetail" value="4"/>
<!-- A value of 4 corresponds to System.Diagnostics.TraceLevel.Verbose -->
</switches>
</system.diagnostics>
Hämta värden för prestandaräknare
Följande konsolprogram visar hur du hämtar prestandaräknarens värden i ditt program. Anslutningar måste vara öppna och aktiva för att information ska returneras för alla Prestandaräknare för Microsoft SqlClient Data Provider för SQL Server.
Anmärkning
I det här exemplet används exempeldatabasen AdventureWorks. Anslutningssträngarna i exempelkoden förutsätter att databasen är installerad och tillgänglig på den lokala datorn och att du har skapat inloggningar som matchar de som anges i anslutningssträngarna. Du kan behöva aktivera SQL Server-inloggningar om servern har konfigurerats med standardsäkerhetsinställningarna som endast tillåter Windows-autentisering. Ändra anslutningssträng efter behov för att passa din miljö.
Example
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>;";
}
}
}