Bagikan melalui


Penghitung kinerja di SqlClient

Berlaku untuk: .NET Framework Tidak didukung. .NET Core Tidak didukung. .NET Standard

Mengunduh ADO.NET

Anda dapat menggunakan Microsoft.Data.SqlClient penghitung kinerja untuk memantau status aplikasi Anda dan sumber daya koneksi yang digunakannya. Penghitung kinerja dapat dipantau dengan menggunakan Windows Performance Monitor atau dapat diakses secara terprogram menggunakan kelas PerformanceCounter di namespace layanan System.Diagnostics.

Penghitung kinerja yang tersedia

Saat ini ada 14 penghitung kinerja berbeda yang tersedia untuk Microsoft.Data.SqlClient seperti yang dijelaskan dalam tabel berikut.

Penghitung kinerja Deskripsi
HardConnectsPerSecond Jumlah koneksi per detik yang sedang dibuat ke server database.
HardDisconnectsPerSecond Jumlah pemutusan sambungan per detik yang sedang dibuat ke server database.
NumberOfActiveConnectionPoolGroups Jumlah grup kumpulan koneksi unik yang aktif. Penghitung ini dikendalikan oleh jumlah string koneksi unik yang ditemukan di AppDomain.
NumberOfActiveConnectionPools Jumlah total kumpulan koneksi.
NumberOfActiveConnections Jumlah koneksi aktif yang saat ini sedang digunakan. Catatan: Penghitung performa ini tidak diaktifkan secara default. Untuk mengaktifkan penghitung kinerja ini, lihat Mengaktifkan penghitung non-default.
NumberOfFreeConnections Jumlah koneksi yang tersedia untuk digunakan dalam kumpulan koneksi. Catatan: Penghitung performa ini tidak diaktifkan secara default. Untuk mengaktifkan penghitung kinerja ini, lihat Mengaktifkan penghitung non-default.
NumberOfInactiveConnectionPoolGroups Jumlah grup kumpulan koneksi unik yang ditandai untuk pemangkasan. Penghitung ini dikendalikan oleh jumlah string koneksi unik yang ditemukan di AppDomain.
NumberOfInactiveConnectionPools Jumlah kumpulan koneksi tidak aktif yang belum memiliki aktivitas terbaru dan menunggu untuk dibuang.
NumberOfNonPooledConnections Jumlah koneksi aktif yang tidak dikumpulkan.
NumberOfPooledConnections Jumlah koneksi aktif yang dikelola oleh infrastruktur pengumpulan koneksi.
NumberOfReclaimedConnections Jumlah koneksi yang telah diperoleh kembali melalui pengumpulan sampah di mana Close atau Dispose tidak dipanggil oleh aplikasi. Catatan Tidak secara eksplisit menutup atau membuang koneksi menyakiti performa.
NumberOfStasisConnections Jumlah koneksi yang saat ini menunggu penyelesaian tindakan dan karenanya tidak tersedia untuk digunakan oleh aplikasi Anda.
SoftConnectsPerSecond Jumlah koneksi aktif yang ditarik dari kumpulan koneksi. Catatan: Penghitung performa ini tidak diaktifkan secara default. Untuk mengaktifkan penghitung kinerja ini, lihat Mengaktifkan penghitung non-default.
SoftDisconnectsPerSecond Jumlah koneksi aktif yang dikembalikan ke kumpulan koneksi. Catatan: Penghitung performa ini tidak diaktifkan secara default. Untuk mengaktifkan penghitung kinerja ini, lihat Mengaktifkan penghitung non-default.

Mengaktifkan penghitung non-default

Penghitung performa NumberOfFreeConnections, NumberOfActiveConnections, SoftDisconnectsPerSecond, dan SoftConnectsPerSecond dinonaktifkan secara default. Tambahkan informasi berikut ke file konfigurasi aplikasi untuk mengaktifkannya:

<system.diagnostics>  
  <switches>  
    <add name="ConnectionPoolPerformanceCounterDetail" value="4"/>  
    <!-- A value of 4 corresponds to System.Diagnostics.TraceLevel.Verbose -->
  </switches>  
</system.diagnostics>  

Mengambil nilai penghitung kinerja

Aplikasi konsol berikut menunjukkan cara mengambil nilai penghitung kinerja di aplikasi Anda. Koneksi harus terbuka dan aktif agar informasi dikembalikan untuk semua penghitung kinerja Penyedia Data Microsoft SqlClient untuk SQL Server.

Catatan

Contoh ini menggunakan sampel database AdventureWorks. String koneksi yang disediakan dalam kode sampel mengasumsikan bahwa database diinstal dan tersedia di komputer lokal, dan Bahwa Anda telah membuat login yang cocok dengan yang disediakan dalam string koneksi. Anda mungkin perlu mengaktifkan SQL Server masuk jika server Anda dikonfigurasi menggunakan pengaturan keamanan default yang hanya mengizinkan Autentikasi Windows. Ubah string koneksi seperlunya agar sesuai dengan lingkungan Anda.

Contoh

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>;";
        }
    }
}

Lihat juga