Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro: .NET Framework
Čítače výkonu můžete použít Microsoft.Data.SqlClient ke sledování stavu aplikace a prostředků připojení, které používá. Čítače výkonu lze monitorovat pomocí systému Windows Sledování výkonu nebo k němu lze přistupovat prostřednictvím kódu programu pomocí PerformanceCounter třídy v System.Diagnostics oboru názvů.
Dostupné čítače výkonu
V současné době je k dispozici Microsoft.Data.SqlClient 14 různých čítačů výkonu, jak je popsáno v následující tabulce.
| Čítač výkonu | Description |
|---|---|
HardConnectsPerSecond |
Počet připojení za sekundu, která se provádí na databázovém serveru. |
HardDisconnectsPerSecond |
Počet odpojení za sekundu, které se provádí na databázovém serveru. |
NumberOfActiveConnectionPoolGroups |
Počet aktivních skupin fondu připojení. Tento čítač je řízen počtem jedinečných připojovací řetězec nalezených v doméně AppDomain. |
NumberOfActiveConnectionPools |
Celkový počet spojovacích poolů. |
NumberOfActiveConnections |
Počet aktivních připojení, která se aktuálně používají. Poznámka: Tento čítač výkonu není ve výchozím nastavení povolen. Pokud chcete povolit tento čítač výkonu, přečtěte si téma Aktivace výchozích čítačů. |
NumberOfFreeConnections |
Počet připojení, která jsou k dispozici pro použití ve fondech připojení. Poznámka: Tento čítač výkonu není ve výchozím nastavení povolen. Pokud chcete povolit tento čítač výkonu, podívejte se na Aktivace čítačů, které nejsou výchozí. |
NumberOfInactiveConnectionPoolGroups |
Počet jedinečných skupin fondu připojení, které jsou označené k vyřazení. Tento čítač je řízen počtem jedinečných připojovací řetězec nalezených v doméně AppDomain. |
NumberOfInactiveConnectionPools |
Počet neaktivních fondů připojení, které nemají žádnou nedávnou aktivitu, a čekají na odstranění. |
NumberOfNonPooledConnections |
Početaktivních |
NumberOfPooledConnections |
Počet aktivních připojení spravovaných infrastrukturou sdružování připojení. |
NumberOfReclaimedConnections |
Počet připojení, která byla uvolněna prostřednictvím uvolňování paměti, kde Close nebo Dispose nebyla volána aplikací.
Poznámka Nezavírání nebo neukončování připojení má negativní vliv na výkon. |
NumberOfStasisConnections |
Počet připojení, která aktuálně čekají na dokončení akce a které jsou proto nedostupné pro použití vaší aplikací. |
SoftConnectsPerSecond |
Počet aktivních připojení, která se načítají z fondu připojení. Poznámka: Tento čítač výkonu není ve výchozím nastavení povolen. Pokud chcete povolit tento čítač výkonu, přečtěte si téma Aktivace čítačů, které jsou ve výchozím nastavení vypnuté. |
SoftDisconnectsPerSecond |
Počet aktivních připojení, která se vrací do fondu připojení. Poznámka: Tento čítač výkonu není ve výchozím nastavení povolen. Pokud chcete povolit tento čítač výkonu, přečtěte si téma Aktivace čítačů vypnutých ve výchozím nastavení. |
Aktivace čítačů mimo výchozí nastavení
Čítače výkonu NumberOfFreeConnections, NumberOfActiveConnections, SoftDisconnectsPerSeconda SoftConnectsPerSecond jsou ve výchozím nastavení vypnuté. Přidejte do konfiguračního souboru aplikace následující informace, abyste je povolili:
<system.diagnostics>
<switches>
<add name="ConnectionPoolPerformanceCounterDetail" value="4"/>
<!-- A value of 4 corresponds to System.Diagnostics.TraceLevel.Verbose -->
</switches>
</system.diagnostics>
Načtení hodnot čítače výkonu
Následující konzolová aplikace ukazuje, jak v aplikaci načíst hodnoty čítače výkonu. Aby bylo možné vrátit informace pro všechny čítače výkonu Microsoft SqlClient Data Provider for SQL Server, musí být připojení otevřená a aktivní.
Poznámka:
Tento příklad používá ukázkovou databázi AdventureWorks. Připojovací řetězce zadané v ukázkovém kódu předpokládají, že je databáze nainstalovaná a dostupná v místním počítači a že jste vytvořili přihlášení, která odpovídají těm, které jsou součástí připojovacích řetězců. Pokud je váš server nakonfigurovaný pomocí výchozího nastavení zabezpečení, které povolují pouze ověřování systému Windows, možná budete muset povolit přihlášení k SQL Serveru. Podle potřeby upravte připojovací řetězec tak, aby vyhovovaly vašemu prostředí.
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>;";
}
}
}