ADO.NET performans sayaçları
ADO.NET 2.0, hem System.Data.OracleClienthem de System.Data.SqlClient için destek içeren performans sayaçları için genişletilmiş destek kullanıma sunulmuştur. System.Data.SqlClient önceki ADO.NET sürümlerinde kullanılabilen performans sayaçları kullanım dışı bırakıldı ve bu konuda açıklanan yeni performans sayaçlarıyla değiştirildi. Uygulamanızın durumunu ve kullandığı bağlantı kaynaklarını izlemek için ADO.NET performans sayaçlarını kullanabilirsiniz. Performans sayaçları Windows Performans İzleyicisi kullanılarak izlenebilir veya ad alanında System.Diagnostics sınıfı kullanılarak PerformanceCounter program aracılığıyla erişilebilir.
Kullanılabilir Performans Sayaçları
Şu anda ve için System.Data.SqlClient System.Data.OracleClient aşağıdaki tabloda açıklandığı gibi 14 farklı performans sayacı vardır. Tek tek sayaçların adlarının Microsoft .NET Framework'ün bölgesel sürümleri arasında yerelleştirilmediğini unutmayın.
Performans sayacı | Açıklama |
---|---|
HardConnectsPerSecond |
Bir veritabanı sunucusuna yapılan saniyede bağlantı sayısı. |
HardDisconnectsPerSecond |
Bir veritabanı sunucusuna yapılan saniyedeki bağlantı kesme sayısı. |
NumberOfActiveConnectionPoolGroups |
Etkin olan benzersiz bağlantı havuzu gruplarının sayısı. Bu sayaç, AppDomain içinde bulunan benzersiz bağlantı dizesi sayısıyla denetlenmektedir. |
NumberOfActiveConnectionPools |
Toplam bağlantı havuzu sayısı. |
NumberOfActiveConnections |
Şu anda kullanımda olan etkin bağlantı sayısı. Not: Bu performans sayacı varsayılan olarak etkin değildir. Bu performans sayacını etkinleştirmek için bkz . Varsayılan Olmayan Sayaçları Etkinleştirme. |
NumberOfFreeConnections |
Bağlantı havuzlarında kullanılabilen bağlantı sayısı. Not: Bu performans sayacı varsayılan olarak etkin değildir. Bu performans sayacını etkinleştirmek için bkz . Varsayılan Olmayan Sayaçları Etkinleştirme. |
NumberOfInactiveConnectionPoolGroups |
Ayıklama için işaretlenen benzersiz bağlantı havuzu gruplarının sayısı. Bu sayaç, AppDomain içinde bulunan benzersiz bağlantı dizesi sayısıyla denetlenmektedir. |
NumberOfInactiveConnectionPools |
Son etkinliklere sahip olmayan ve atılmayı bekleyen etkin olmayan bağlantı havuzlarının sayısı. |
NumberOfNonPooledConnections |
Havuza alınmayan etkin bağlantı sayısı. |
NumberOfPooledConnections |
Bağlantı havuzu altyapısı tarafından yönetilen etkin bağlantı sayısı. |
NumberOfReclaimedConnections |
Uygulama tarafından çağrılmayan veya Dispose çağrılmayan çöp toplama Close aracılığıyla geri kazanılmış bağlantı sayısı. Bağlantıların açıkça kapatılmaması veya devre dışı bırakmaması performansa zarar verir. |
NumberOfStasisConnections |
Şu anda bir eylemin tamamlanmasını bekleyen ve bu nedenle uygulamanız tarafından kullanılamayan bağlantı sayısı. |
SoftConnectsPerSecond |
Bağlantı havuzundan çekilen etkin bağlantı sayısı. Not: Bu performans sayacı varsayılan olarak etkin değildir. Bu performans sayacını etkinleştirmek için bkz . Varsayılan Olmayan Sayaçları Etkinleştirme. |
SoftDisconnectsPerSecond |
Bağlantı havuzuna döndürülen etkin bağlantı sayısı. Not: Bu performans sayacı varsayılan olarak etkin değildir. Bu performans sayacını etkinleştirmek için bkz . Varsayılan Olmayan Sayaçları Etkinleştirme. |
Bağlantı Havuzu Grupları ve Bağlantı Havuzları
Windows Kimlik Doğrulaması (tümleşik güvenlik) kullanırken hem hem NumberOfActiveConnectionPools
de NumberOfActiveConnectionPoolGroups
performans sayaçlarını izlemeniz gerekir. Bunun nedeni, bağlantı havuzu gruplarının benzersiz bağlantı dizesi eşlemesidir. Tümleşik güvenlik kullanıldığında, bağlantı havuzları bağlantı dizesi'lerle eşler ve ayrıca tek tek Windows kimlikleri için ayrı havuzlar oluşturur. Örneğin, her biri aynı AppDomain içindeki Fred ve Julie bağlantı dizesi kullanırsa, bağlantı dizesi "Data Source=MySqlServer;Integrated Security=true"
için bir bağlantı havuzu grubu oluşturulur ve biri Fred ve biri Julie için olmak üzere iki ek havuz oluşturulur. John ve Martha aynı SQL Server oturum açma bilgilerine sahip bir bağlantı dizesi kullanırsa, "Data Source=MySqlServer;User Id=lowPrivUser;Password=[PLACEHOLDER]"
lowPrivUser kimliği için yalnızca tek bir havuz oluşturulur.
Önemli
Microsoft, kullanılabilir en güvenli kimlik doğrulama akışını kullanmanızı önerir. Azure SQL'e bağlanıyorsanız önerilen kimlik doğrulama yöntemi Azure kaynakları için Yönetilen Kimlikler'dir.
Varsayılan Olmayan Sayaçları Etkinleştirme
, , NumberOfActiveConnections
SoftDisconnectsPerSecond
ve SoftConnectsPerSecond
performans sayaçları NumberOfFreeConnections
varsayılan olarak kapalıdır. Aşağıdaki bilgileri uygulamanın yapılandırma dosyasına ekleyerek bunları etkinleştirin:
<system.diagnostics>
<switches>
<add name="ConnectionPoolPerformanceCounterDetail"
value="4"/>
</switches>
</system.diagnostics>
Performans Sayacı Değerlerini Alma
Aşağıdaki konsol uygulaması, uygulamanızda performans sayacı değerlerinin nasıl alınıyor olduğunu gösterir. Tüm ADO.NET performans sayaçları için bilgilerin döndürülebilmesi için bağlantıların açık ve etkin olması gerekir.
Not
Bu örnekte SQL Server ile birlikte verilen örnek AdventureWorks veritabanı kullanılmaktadır. Örnek kodda sağlanan bağlantı dizesi, veritabanının sqlexpress örnek adıyla yerel bilgisayarda yüklü ve kullanılabilir olduğunu ve bağlantı dizesi'lerde sağlananlarla eşleşen SQL Server oturum açma bilgileri oluşturduğunuzu varsayar. Sunucunuz yalnızca Windows Kimlik Doğrulamasına izin veren varsayılan güvenlik ayarları kullanılarak yapılandırılmışsa SQL Server oturum açma bilgilerini etkinleştirmeniz gerekebilir. bağlantı dizesi ortamınıza uyacak şekilde değiştirin.
Örnek
Option Explicit On
Option Strict On
Imports System.Data.SqlClient
Imports System.Diagnostics
Imports System.Runtime.InteropServices
Class Program
Private PerfCounters(9) As PerformanceCounter
Private connection As SqlConnection = New SqlConnection
Public Shared Sub Main()
Dim prog As Program = 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()
End Sub
Private Sub CreateConnections()
' List the Performance counters.
WritePerformanceCounters()
' Create 4 connections and display counter information.
Dim connection1 As SqlConnection = New SqlConnection( _
GetIntegratedSecurityConnectionString)
connection1.Open()
Console.WriteLine("Opened the 1st Connection:")
WritePerformanceCounters()
Dim connection2 As SqlConnection = New SqlConnection( _
GetSqlConnectionStringDifferent)
connection2.Open()
Console.WriteLine("Opened the 2nd Connection:")
WritePerformanceCounters()
Console.WriteLine("Opened the 3rd Connection:")
Dim connection3 As SqlConnection = New SqlConnection( _
GetSqlConnectionString)
connection3.Open()
WritePerformanceCounters()
Dim connection4 As SqlConnection = 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()
End Sub
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
End Enum
Private Sub SetUpPerformanceCounters()
connection.Close()
Me.PerfCounters(9) = New PerformanceCounter()
Dim instanceName As String = GetInstanceName()
Dim apc As Type = GetType(ADO_Net_Performance_Counters)
Dim i As Integer = 0
Dim s As String = ""
For Each s In [Enum].GetNames(apc)
Me.PerfCounters(i) = New PerformanceCounter()
Me.PerfCounters(i).CategoryName = ".NET Data Provider for SqlServer"
Me.PerfCounters(i).CounterName = s
Me.PerfCounters(i).InstanceName = instanceName
i = (i + 1)
Next
End Sub
Private Declare Function GetCurrentProcessId Lib "kernel32.dll" () As Integer
Private Function GetInstanceName() As String
'This works for Winforms apps.
Dim instanceName As String = _
System.Reflection.Assembly.GetEntryAssembly.GetName.Name
' Must replace special characters like (, ), #, /, \\
Dim instanceName2 As String = _
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("\\", "_")
Dim pid As String = GetCurrentProcessId.ToString
instanceName = (instanceName + ("[" & (pid & "]")))
Console.WriteLine("Instance Name: {0}", instanceName)
Console.WriteLine("---------------------------")
Return instanceName
End Function
Private Sub WritePerformanceCounters()
Console.WriteLine("---------------------------")
For Each p As PerformanceCounter In Me.PerfCounters
Console.WriteLine("{0} = {1}", p.CounterName, p.NextValue)
Next
Console.WriteLine("---------------------------")
End Sub
End Class
using System;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Runtime.InteropServices;
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("---------------------------");
}
}