Aracılığıyla paylaş


SqlClient'da performans sayaçları

Şunlar için geçerlidir: .NET Framework

ADO.NET indirin

Uygulamanızın durumunu ve kullandığı bağlantı kaynaklarını izlemek için performans sayaçlarını kullanabilirsiniz Microsoft.Data.SqlClient . Performans sayaçları Windows Performans İzleyicisi kullanılarak izlenebilir veya ad alanında PerformanceCounter sınıfı kullanılarak System.Diagnostics program aracılığıyla erişilebilir.

Kullanılabilir performans sayaçları

Şu anda için aşağıdaki tabloda açıklandığı gibi 14 farklı performans sayacı vardır Microsoft.Data.SqlClient .

Performans sayacı Description
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 olarak kapalı 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 olarak kapalı 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 Close çağrılmayan çöp toplama Dispose aracılığıyla geri kazanılmış bağlantı sayısı. Not 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 olarak kapalı 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 olarak kapalı sayaçları etkinleştirme.

Varsayılan olarak kapalı olan sayaçları etkinleştirme

, , NumberOfFreeConnectionsNumberOfActiveConnectionsve SoftDisconnectsPerSecond performans sayaçları SoftConnectsPerSecondvarsayı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"/>  
    <!-- A value of 4 corresponds to System.Diagnostics.TraceLevel.Verbose -->
  </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. Sql Server performans sayaçları için tüm Microsoft SqlClient Veri Sağlayıcısı için bilgilerin döndürülebilmesi için bağlantıların açık ve etkin olması gerekir.

Uyarı

Bu örnekte örnek AdventureWorks veritabanı kullanılmaktadır. Örnek kodda sağlanan bağlantı dizeleri, veritabanının yerel bilgisayarda yüklü ve kullanılabilir olduğunu ve bağlantı dizelerinde sağlananlarla eşleşen 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.

Example

using System;
using Microsoft.Data.SqlClient;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace SqlClient_PerformanceCounter
{
    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>;";
        }
    }
}

Ayrıca bakınız