Memecahkan masalah kesalahan koneksi sementara di SQL Database dan SQL Managed Instance

Berlaku untuk:Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics

Artikel ini menjelaskan cara mencegah, memecahkan masalah, mendiagnosis, dan mengurangi kesalahan koneksi dan kesalahan sementara yang ditemui aplikasi klien Anda saat berinteraksi dengan Azure SQL Database, Azure SQL Managed Instance, dan Azure Synapse Analytics. Pelajari cara mengonfigurasi logika coba lagi, menyusun string koneksi, dan menyesuaikan pengaturan koneksi lainnya.

Kesalahan sementara (kegagalan sementara)

Kesalahan sementara, juga dikenal sebagai kegagalan sementara, memiliki penyebab mendasar yang segera selesai sendiri. Sesekali penyebab kesalahan sementara adalah ketika sistem Azure dengan cepat menggeser sumber daya perangkat keras untuk menyeimbangkan beban kerja dengan lebih baik. Sebagian besar kejadian konfigurasi ulang ini selesai dalam waktu kurang dari 60 detik. Selama rentang waktu konfigurasi ulang ini, Anda mungkin mengalami masalah menyambungkan ke database Anda di SQL Database. Aplikasi yang tersambung ke database Anda harus dibangun untuk memperkirakan kesalahan sementara ini. Untuk menanganinya, terapkan logika coba lagi dalam kode mereka alih-alih memunculkannya kepada pengguna sebagai kesalahan aplikasi.

Jika program klien Anda ADO.NET, program Anda diberitahu tentang kesalahan sementara dengan melempar SqlException.

Koneksi vs. perintah

Coba lagi SQL Database dan koneksi SQL Managed Instance atau buat lagi, bergantung pada hal berikut ini:

  • Kesalahan sementara terjadi selama percobaan koneksi

Setelah penundaan beberapa detik, coba lagi koneksi.

  • Kesalahan sementara terjadi selama perintah kueri SQL Database dan SQL Managed Instance

Jangan langsung mencoba kembali perintah. Sebaliknya, setelah penundaan, bangunlah koneksi. Kemudian coba lagi perintahnya.

Coba lagi logika untuk kesalahan sementara

Program klien yang sesekali menemui kesalahan sementara akan lebih kuat ketika berisi logika coba lagi. Saat program Anda berkomunikasi dengan database Anda di SQL Database melalui middleware pihak ketiga, tanyakan kepada vendor apakah middleware berisi logika coba lagi untuk kesalahan sementara.

Prinsip untuk mencoba kembali

  • Jika kesalahannya bersifat sementara, coba lagi untuk membuka koneksi.
  • Jangan langsung mencoba kembali SQL Database atau pernyataan SELECT SQL Managed Instance yang gagal menyelesaikan kesalahan sementara. Sebaliknya, buatlah koneksi baru, dan kemudian coba SELECT lagi.
  • Ketika SQL Database atau pernyataan UPDATE SQL Managed Instance gagal menyelesaikan kesalahan sementara, buat koneksi baru sebelum Anda mencoba kembali UPDATE. Logika coba lagi harus memastikan bahwa seluruh transaksi database selesai atau bahwa seluruh transaksi digulung balik.

Pertimbangan lain untuk mencoba kembali

  • Program batch yang secara otomatis dimulai setelah jam kerja dan selesai sebelum pagi hari mampu menjadi sangat sabar dengan interval waktu yang lama di antara percobaan ulangnya.
  • Program antarmuka pengguna harus memperhitungkan kecenderungan manusia untuk menyerah setelah menunggu terlalu lama. Solusinya tidak boleh mencoba kembali setiap beberapa detik, karena kebijakan itu dapat membanjiri sistem dengan permintaan.

Peningkatan interval di antara percobaan ulang

Kami sarankan Anda menunggu selama 5 detik sebelum mencoba kembali untuk pertama kali. Mencoba kembali setelah penundaan yang lebih singkat dari 5 detik berisiko membuat layanan cloud kewalahan. Untuk setiap percobaan berikutnya, penundaan harus tumbuh secara eksponensial, hingga maksimum 60 detik.

Untuk diskusi periode pemblokiran untuk klien yang menggunakan ADO.NET, lihat Kumpulan koneksi (ADO.NET).

Anda juga mungkin ingin menyetel jumlah maksimum percobaan ulang sebelum program berhenti sendiri.

Contoh kode dengan logika coba lagi

Contoh kode dengan logika coba lagi tersedia di:

Uji logika coba lagi Anda

Untuk menguji logika coba lagi, Anda harus mensimulasikan atau menyebabkan kesalahan yang bisa diperbaiki saat program masih berjalan.

Ujilah dengan memutus sambungan dari jaringan

Salah satu cara untuk menguji logika coba lagi adalah dengan memutuskan sambungan komputer klien dari jaringan saat program sedang berjalan. Kesalahannya adalah:

  • SqlException.Number = 11001
  • Pesan: "Host semacam itu tidak diketahui"

Sebagai bagian dari upaya percobaan ulang yang pertama, Anda dapat menyambungkan kembali komputer klien Anda ke jaringan lalu coba sambungkan.

Untuk membuat pengujian ini praktis, cabut komputer Anda dari jaringan sebelum Anda memulai program. Kemudian program Anda mengenali parameter runtime yang menyebabkan program:

  • Menambahkan 11001 ke daftar kesalahan untuk dipertimbangkan sementara.
  • Mencoba koneksi pertamanya seperti biasa.
  • Setelah kesalahan diketahui, hapus 11001 dari daftar.
  • Menampilkan pesan yang memberitahu pengguna untuk mencolokkan komputer ke jaringan.
  • Jeda eksekusi lebih lanjut dengan menggunakan metode Console.ReadLine atau dialog dengan tombol OK. Pengguna menekan tombol Enter setelah komputer dicolokkan ke jaringan.
  • Coba lagi untuk tersambung, dengan harapan berhasil.

Ujilah dengan salah mengeja nama pengguna saat menyambungkan

Program Anda dapat salah mengeja nama pengguna dengan sengaja sebelum mencoba koneksi pertama kali. Kesalahannya adalah:

  • SqlException.Number = 18456
  • Pesan: "Login gagal untuk pengguna 'WRONG_MyUserName'."

Sebagai bagian dari upaya percobaan ulang yang pertama, program Anda dapat memperbaiki kesalahan ejaan lalu coba menyambungkan.

Untuk membuat pengujian ini praktis, program Anda mengenali parameter runtime yang menyebabkan program:

  • Menambahkan 18456 ke daftar kesalahan untuk dipertimbangkan sementara.
  • Dengan sengaja menambahkan 'WRONG_' ke nama pengguna.
  • Setelah kesalahan diketahui, menghapus 18456 dari daftar.
  • Menghapus 'WRONG_' dari nama pengguna.
  • Coba lagi untuk tersambung, dengan harapan berhasil.

Parameter .NET SqlConnection untuk coba lagi koneksi

Jika program klien Anda tersambung ke database Anda di Azure SQL Database dengan menggunakan kelas .NET Framework System.Data.SqlClient.Sql Koneksi ion, gunakan .NET 4.6.1 atau versi yang lebih baru (atau .NET Core) sehingga Anda dapat menggunakan fitur coba lagi koneksinya. Untuk informasi selengkapnya tentang fitur ini, lihat Sql Koneksi ion.KoneksiProperti ionString.

Saat Anda menyusun string koneksi untuk objek SqlConnection Anda, koordinasikan nilai di antara parameter berikut:

  • Koneksi RetryCount: Defaultnya adalah 1. Rentangnya adalah 0 hingga 255.
  • Koneksi RetryInterval: Defaultnya adalah 10 detik. Rentangnya adalah 1 hingga 60.
  • batas waktu Koneksi ion: Defaultnya adalah 15 detik. Rentangnya adalah 0 hingga 2147483647.
  • Batas Waktu Perintah: Defaultnya adalah 30 detik. Rentangnya adalah 0 hingga 2147483647.

Pengaturan coba lagi koneksi (Koneksi RetryCount dan Koneksi RetryInterval) berlaku untuk ketahanan koneksi. Koneksi ketahanan mencakup jenis yang berbeda berikut:

  • Ketahanan koneksi terbuka mengacu pada Sql awal Koneksi ion. Buka atau metode OpenAsync(). Upaya koneksi pertama dihitung sebagai coba nol. Koneksi RetryCount berlaku untuk percobaan ulang berikutnya. Oleh karena itu, jika nol koneksi gagal (ini mungkin tidak segera terjadi), Koneksi RetryInterval diterapkan terlebih dahulu diikuti oleh upaya Koneksi RetryCount (dan Koneksi RetryInterval) berikutnya. Untuk memanfaatkan semua upaya coba lagi, properti batas waktu Koneksi ion harus menyediakan waktu untuk semua upaya.

  • Ketahanan koneksi menganggur mengacu pada deteksi otomatis dan koneksi ulang koneksi diam yang ada yang rusak. Upaya pertama untuk menyambungkan kembali koneksi diam yang rusak dihitung sebagai upaya coba lagi pertama. Untuk memanfaatkan semua upaya coba lagi, Batas Waktu Perintah harus menyediakan waktu untuk semua upaya.

Contoh: Asumsikan nilai berikut untuk parameter Koneksi RetryCount dan Koneksi RetryInterval:

Koneksi RetryCount: 3 Koneksi RetryInterval: 10 detik

Lihat bagaimana nilai-nilai ini digunakan dalam skenario berikut:

Skenario: Koneksi baru

4:10:00 - Koneksi ion. Open() - upaya nol

4:10:01 - kegagalan Koneksi ion terdeteksi

4:10:11 - Coba lagi 1 --> Percobaan ulang pertama terjadi setelah Koneksi RetryInterval

4:10:21 - Coba Lagi 2

4:10:31 - Coba Lagi 3

Untuk skenario ini, nilai yang Anda pilih harus memenuhi kondisi berikut:
Connection Timeout > = ConnectRetryCount * ConnectionRetryInterval

Misalnya, jika jumlahnya adalah 3 dan intervalnya adalah 10 detik, batas waktu hanya 29 detik tidak memberikan cukup waktu bagi coba lagi ketiga dan terakhir sistem untuk menyambungkan:

29 < 3 * 10

Skenario: Koneksi menganggur

Koneksi RetryCount: 3 Koneksi RetryInterval: 10 detik

4:10:00 - Koneksi rusak terdeteksi pada eksekusi perintah

4:10:00 - Coba lagi 1 -->Percobaan ulang pertama terjadi segera

4:10:10 - Coba Lagi 2

4:10:20 - Coba Lagi 3

Ini bukan koneksi awal. Oleh karena itu, batas waktu Koneksi ion tidak berlaku. Namun, karena pemulihan koneksi terjadi selama eksekusi perintah, pengaturan Batas Waktu Perintah memang berlaku. Default Batas Waktu Perintah adalah 30 detik. Meskipun, pemulihan koneksi cepat dalam keadaan umum, pemadaman terputus-putus, dapat menyebabkan pemulihan mengambil beberapa waktu eksekusi perintah.

Untuk skenario ini, jika Anda ingin memanfaatkan sepenuhnya upaya pemulihan koneksi diam, nilai yang Anda pilih harus memenuhi kondisi berikut:
Command Timeout > (ConnectRetryCount - 1) * ConnectionRetryInterval

Misalnya, jika jumlahnya adalah 3 dan intervalnya adalah 10 detik, nilai batas waktu perintah yang lebih rendah dari 20 detik tidak akan memberikan cukup waktu untuk coba lagi ketiga dan terakhir untuk menyambungkan: (3 - 1) * 10 = 20'

Selain itu, pertimbangkan bahwa perintah itu sendiri memerlukan waktu untuk dijalankan setelah koneksi dipulihkan.

Catatan

Nilai durasi yang disediakan dalam skenario ini hanya untuk demonstrasi. Waktu deteksi aktual dalam kedua skenario bergantung pada infrastruktur yang mendasarinya.

Koneksi vs. perintah

Parameter ConnectRetryCount dan ConnectRetryInterval memungkinkan objek SqlConnection Anda mencoba kembali menyambungkan operasi tanpa memberi tahu atau mengganggu program Anda, seperti mengembalikan kontrol ke program Anda. Percobaan ulang dapat terjadi dalam situasi berikut:

  • Panggilan metode SqlConnection.Open
  • Panggilan metode SqlConnection.Execute

Ada kehalusan. Jika terjadi kesalahan sementara saat kueri Anda dijalankan, objek SqlConnection Anda tidak mencoba lagi menyambungkan operasi. Tentu saja tidak mencoba kembali kueri Anda. Namun, SqlConnection memeriksa dengan sangat cepat koneksi sebelum mengirim kueri Anda untuk dieksekusi. Jika pemeriksaan cepat mendeteksi masalah koneksi, SqlConnection mencoba kembali menyambungkan operasi. Jika percobaan ulangnya berhasil, kueri Anda dikirim untuk dieksekusi.

Haruskah ConnectRetryCount digabungkan dengan logika coba lagi aplikasi

Misalkan aplikasi Anda memiliki logika coba lagi kustom yang kuat. Mungkin mencoba kembali menyambungkan operasi empat kali. Jika Anda menambahkan ConnectRetryInterval dan ConnectRetryCount =3 ke string koneksi, Anda akan meningkatkan jumlah coba lagi menjadi 4 * 3 = 12 kali percobaan ulang. Anda mungkin tidak berniat membuat jumlah percobaan ulang yang tinggi.

Koneksi ke database Anda di SQL Database

Koneksi: String koneksi

String koneksi yang diperlukan untuk menyambungkan ke database Anda sedikit berbeda dari string yang digunakan untuk menyambungkan ke SQL Server. Anda bisa menyalin string koneksi untuk database Anda dari portal Microsoft Azure.

Mendapatkan string koneksi dari portal Azure

Gunakan portal Azure untuk mendapatkan string koneksi yang diperlukan program klien Anda untuk berinteraksi dengan Azure SQL Database.

  1. Pilih Semua layanan>database SQL.

  2. Masukkan nama database Anda ke dalam kotak teks filter di dekat kiri atas panel database SQL.

  3. Pilih baris untuk database Anda.

  4. Setelah panel muncul untuk database Anda, untuk kenyamanan visual pilih tombol Minimalkan untuk menciutkan bilah yang Anda gunakan untuk penjelajahan dan pemfilteran database.

  5. Pada panel untuk database Anda, pilih Perlihatkan database string koneksi.

  6. Salin string koneksi yang sesuai. yaitu Jika Anda berniat menggunakan pustaka koneksi ADO.NET, salin string yang sesuai dari tab ADO.NET.

    Copy the ADO connection string for your database

  7. Edit string koneksi sesuai kebutuhan. misalnya Masukkan kata sandi Anda ke dalam string koneksi, atau hapus "@<servername>" dari nama pengguna jika nama pengguna atau nama server terlalu panjang.

  8. Dalam satu format atau lainnya, tempel informasi string koneksi ke kode program klien Anda.

Untuk informasi lebih lanjut, lihat String koneksi dan file konfigurasi.

Koneksi: Alamat IP

Anda harus mengonfigurasi SQL Database untuk menerima komunikasi dari alamat IP komputer yang menghosting program klien Anda. Untuk menyiapkan konfigurasi ini, edit pengaturan firewall melalui portal Microsoft Azure.

Jika Anda lupa mengonfigurasi alamat IP, program Anda gagal dengan pesan kesalahan berguna yang menyatakan alamat IP yang diperlukan.

  1. Masuk ke portal Azure.

  2. Pada daftar di sebelah kiri, pilih Semua layanan.

  3. Gulir dan pilih server SQL.

    Find your Azure SQL Database server in the portal

  4. Dalam kotak teks filter, mulai ketikkan nama server Anda. Baris Anda ditampilkan.

  5. Pilih baris untuk server Anda. Panel untuk server Anda ditampilkan.

  6. Di panel server Anda, pilih Pengaturan.

  7. Pilih Firewall.

    Select Settings > Firewall

  8. Pilih Tambahkan IP Klien. Ketik nama untuk aturan baru Anda di kotak teks pertama.

  9. Ketik nilai alamat IP rendah dan tinggi untuk rentang yang ingin Anda aktifkan.

    • Memiliki ujung nilai rendah dengan .0 dan ujung nilai tinggi dengan .255 dapat berguna.
  10. Pilih Simpan.

Untuk informasi selengkapnya, lihat Mengonfigurasi pengaturan firewall di SQL Database.

Koneksi: Port

Biasanya, Anda perlu memastikan bahwa hanya port 1433 yang terbuka untuk komunikasi keluar di komputer yang menghosting program klien Anda.

Misalnya, ketika program klien Anda dihosting di komputer Windows, Anda dapat menggunakan Windows Firewall pada host untuk membuka port 1433.

  1. Buka Panel Kontrol.
  2. Pilih Semua Item Panel Kontrol> Windows Firewall>Pengaturan Tingkat Lanjut>Aturan Keluar>Tindakan>Aturan Baru.

Jika program klien Anda dihosting di komputer virtual azure (VM), baca Port di luar 1433 untuk ADO.NET 4.5 dan SQL Database.

Untuk informasi latar belakang tentang konfigurasi port dan alamat IP di database Anda, lihat Firewall Azure SQL Database.

Koneksi: ADO.NET 4.6.2 atau yang lebih baru

Jika program Anda menggunakan kelas ADO.NET seperti System.Data.SqlClient.SqlConnection untuk tersambung ke SQL Database, kami sarankan Anda menggunakan .NET Framework versi 4.6.2 atau yang lebih baru.

Memulai ADO.NET 4.6.2

  • Koneksi terbuka mencoba untuk segera melakukan percobaan ulang untuk Azure SQL, sehingga meningkatkan kinerja aplikasi yang mendukung cloud.

Memulai ADO.NET 4.6.1

  • Untuk SQL Database, keandalan ditingkatkan saat Anda membuka koneksi dengan menggunakan metode SqlConnection.Open. Metode Open sekarang menggabungkan mekanisme upaya terbaik percobaan ulang dalam menanggapi kesalahan sementara untuk kesalahan tertentu dalam periode waktu habis koneksi.
  • Kumpulan koneksi didukung, yang mencakup verifikasi yang efisien bahwa objek koneksi yang diberikan program Anda berfungsi.

Saat Anda menggunakan objek koneksi dari kumpulan koneksi, kami menyarankan agar program Anda menutup koneksi sementara ketika tidak segera digunakan. Tidak mahal untuk membuka kembali koneksi, tetapi mahal untuk membuat koneksi baru.

Jika Anda menggunakan ADO.NET 4.0 atau yang lebih lama, kami sarankan Anda meningkatkan ke versi ADO.NET. Pada Agustus 2018, Anda dapat mengunduh ADO.NET 4.6.2.

Diagnostik

Diagnostik: Menguji apakah utilitas dapat tersambung

Jika program Anda gagal tersambung ke database Anda di SQL Database, salah satu opsi diagnostik adalah mencoba menyambung dengan program utilitas. Idealnya, utilitas tersambung dengan menggunakan pustaka kode yang sama dengan yang digunakan program Anda.

Pada komputer Windows mana pun, Anda dapat mencoba utilitas ini:

  • SQL Server Management Studio (ssms.exe), yang tersambung dengan menggunakan ADO.NET
  • sqlcmd.exe, yang tersambung dengan menggunakan ODBC

Setelah program Anda tersambung, uji apakah kueri SQL SELECT singkat berfungsi.

Diagnostik: Periksa port yang terbuka

Jika Anda menduga bahwa upaya koneksi gagal karena masalah port, Anda dapat menjalankan utilitas di komputer Anda yang melaporkan konfigurasi port.

Di Linux, utilitas berikut mungkin membantu:

  • netstat -nap
  • nmap -sS -O 127.0.0.1: Ubah nilai contoh menjadi alamat IP Anda.

Pada Windows, utilitas PortQry.exe mungkin membantu. Berikut adalah contoh eksekusi yang dikueri situasi port pada database di SQL Database dan yang dijalankan pada komputer laptop:

[C:\Users\johndoe\]
>> portqry.exe -n johndoesvr9.database.windows.net -p tcp -e 1433

Querying target system called: johndoesvr9.database.windows.net

Attempting to resolve name to IP address...
Name resolved to 23.100.117.95

querying...
TCP port 1433 (ms-sql-s service): LISTENING

[C:\Users\johndoe\]
>>

Diagnostik: Catat kesalahan Anda

Masalah terputus-putus terkadang paling baik didiagnosis dengan deteksi pola umum selama berhari-hari atau berminggu-minggu.

Klien Anda dapat membantu diagnosis dengan melakukan pengelogan pada semua kesalahan yang dihadapinya. Anda mungkin dapat menghubungkan entri log dengan data kesalahan yang masuk ke catatan SQL Database itu sendiri secara internal.

Enterprise Library 6 (EntLib60) menawarkan kelas yang dikelola .NET untuk membantu pengelogan. Untuk informasi selengkapnya, lihat 5 - Semudah lepas dari log: Gunakan Blok Aplikasi Pengelogan.

Diagnostik: Memeriksa kesalahan di log sistem

Berikut adalah beberapa pernyataan T-SQL SELECT yang mengkueri log galat dan informasi lainnya.

Kueri log Deskripsi
SELECT e.*
FROM sys.event_log AS e
WHERE e.database_name = 'myDbName'
AND e.event_category = 'connectivity'
AND 2 >= DateDiff
  (hour, e.end_time, GetUtcDate())
ORDER BY e.event_category,
  e.event_type, e.end_time;
Tampilan sys.event_log menawarkan informasi tentang peristiwa individual, yang mencakup beberapa yang dapat menyebabkan kesalahan sementara atau kegagalan konektivitas.

Idealnya, Anda dapat mengkorelasikan nilai start_time atau end_time dengan informasi kapan program klien Anda mengalami masalah.

Anda harus tersambung ke database master untuk menjalankan kueri ini.
SELECT c.*
FROM sys.database_connection_stats AS c
WHERE c.database_name = 'myDbName'
AND 24 >= DateDiff
  (hour, c.end_time, GetUtcDate())
ORDER BY c.end_time;
Tampilan sys.database_connection_stats menawarkan jumlah agregat jenis kejadian untuk diagnostik tambahan.

Anda harus tersambung ke database master untuk menjalankan kueri ini.

Diagnostik: Mencari kejadian masalah di log SQL Database

Anda bisa mencari entri tentang kejadian masalah di log SQL Database. Cobalah pernyataan Transact-SQL SELECT berikut ini di database master:

SELECT
   object_name
  ,CAST(f.event_data as XML).value
      ('(/event/@timestamp)[1]', 'datetime2')                      AS [timestamp]
  ,CAST(f.event_data as XML).value
      ('(/event/data[@name="error"]/value)[1]', 'int')             AS [error]
  ,CAST(f.event_data as XML).value
      ('(/event/data[@name="state"]/value)[1]', 'int')             AS [state]
  ,CAST(f.event_data as XML).value
      ('(/event/data[@name="is_success"]/value)[1]', 'bit')        AS [is_success]
  ,CAST(f.event_data as XML).value
      ('(/event/data[@name="database_name"]/value)[1]', 'sysname') AS [database_name]
FROM
  sys.fn_xe_telemetry_blob_target_read_file('el', null, null, null) AS f
WHERE
  object_name != 'login_event'  -- Login events are numerous.
  and
  '2015-06-21' < CAST(f.event_data as XML).value
        ('(/event/@timestamp)[1]', 'datetime2')
ORDER BY
  [timestamp] DESC
;

Beberapa baris yang dikembalikan dari sys.fn_xe_telemetry_blob_target_read_file

Contoh berikut memperlihatkan seperti apa tampilan baris yang dikembalikan. Nilai kosong yang ditampilkan seringkali tidak kosong di baris lain.

object_name                   timestamp                    error  state  is_success  database_name

database_xml_deadlock_report  2015-10-16 20:28:01.0090000  NULL   NULL   NULL        AdventureWorks

Enterprise Library 6

Enterprise Library 6 (EntLib60) adalah kerangka kerja kelas .NET yang membantu Anda mengimplementasikan klien layanan cloud yang kuat, salah satunya adalah SQL Database. Untuk menemukan topik yang didedikasikan untuk setiap area yang dapat dibantu EntLib60, lihat Enterprise Library 6 - April 2013.

Logika coba lagi untuk menangani kesalahan sementara adalah salah satu area yang dapat dibantu EntLib60. Untuk informasi selengkapnya, lihat 4 - Ketekunan, rahasia semua keberhasilan: Menggunakan Blok Aplikasi Penanganan Kesalahan Sementara.

Catatan

Kode sumber untuk EntLib60 tersedia untuk diunduh publik dari Pusat Unduhan. Microsoft tidak memiliki rencana untuk membuat pembaruan fitur lebih lanjut atau pembaruan pemeliharaan untuk EntLib.

Kelas EntLib60 untuk kesalahan sementara dan coba lagi

Kelas EntLib60 berikut ini sangat berguna untuk logika coba lagi. Semua kelas ini ditemukan di atau di bawah namespace Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.

Di namespace Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling:

  • Kelas RetryPolicy
    • Metode ExecuteAction
  • Kelas ExponentialBackoff
  • Kelas SqlDatabaseTransientErrorDetectionStrategy
  • Kelas reliableSql Koneksi ion
    • Metode ExecuteCommand

Di namespace Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.TestSupport:

  • Kelas AlwaysTransientErrorDetectionStrategy
  • Kelas NeverTransientErrorDetectionStrategy

Berikut adalah beberapa tautan ke informasi tentang EntLib60:

EntLib60: Blok pengelogan

  • Blok pengelogan adalah solusi yang sangat fleksibel dan dapat dikonfigurasi yang dapat Anda gunakan untuk:
    • Membuat dan menyimpan pesan log di berbagai lokasi.
    • Mengkategorikan dan memfilter pesan.
    • Kumpulkan informasi kontekstual yang berguna untuk penelusuran kesalahan dan tracing, serta untuk persyaratan audit dan pengelogan umum.
  • Blok pengelogan mengabstraksi fungsi pengelogan dari tujuan log sehingga kode aplikasi konsisten, terlepas dari lokasi dan jenis penyimpanan pengelogan target.

Untuk informasi selengkapnya, lihat 5 - Semudah lepas dari log: Gunakan Blok Aplikasi Pengelogan.

Kode sumber metode EntLib60 IsTransient

Selanjutnya, dari kelas SqlDatabaseTransientErrorDetectionStrategy, adalah kode sumber C# untuk metode IsTransient. Kode sumber mengklarifikasi kesalahan mana yang dianggap sementara dan layak untuk dicoba lagi, per April 2013.

public bool IsTransient(Exception ex)
{
  if (ex != null)
  {
    SqlException sqlException;
    if ((sqlException = ex as SqlException) != null)
    {
      // Enumerate through all errors found in the exception.
      foreach (SqlError err in sqlException.Errors)
      {
        switch (err.Number)
        {
            // SQL Error Code: 40501
            // The service is currently busy. Retry the request after 10 seconds.
            // Code: (reason code to be decoded).
          case ThrottlingCondition.ThrottlingErrorNumber:
            // Decode the reason code from the error message to
            // determine the grounds for throttling.
            var condition = ThrottlingCondition.FromError(err);

            // Attach the decoded values as additional attributes to
            // the original SQL exception.
            sqlException.Data[condition.ThrottlingMode.GetType().Name] =
              condition.ThrottlingMode.ToString();
            sqlException.Data[condition.GetType().Name] = condition;

            return true;

          case 10928:
          case 10929:
          case 10053:
          case 10054:
          case 10060:
          case 40197:
          case 40540:
          case 40613:
          case 40143:
          case 233:
          case 64:
            // DBNETLIB Error Code: 20
            // The instance of SQL Server you attempted to connect to
            // does not support encryption.
          case (int)ProcessNetLibErrorCode.EncryptionNotSupported:
            return true;
        }
      }
    }
    else if (ex is TimeoutException)
    {
      return true;
    }
    else
    {
      EntityException entityException;
      if ((entityException = ex as EntityException) != null)
      {
        return this.IsTransient(entityException.InnerException);
      }
    }
  }

  return false;
}

Langkah berikutnya