SQL Veritabanı'nda ve SQL Yönetilen Örneği'nde geçici bağlantı hatalarını giderme

Şunlar için geçerlidir: Azure SQL Veritabanı Azure SQL Yönetilen Örneği Azure Synapse Analytics

Bu makalede, istemci uygulamanızın Azure SQL Veritabanı, Azure SQL Yönetilen Örneği ve Azure Synapse Analytics ile etkileşim kurarken karşılaştığı bağlantı hatalarını ve geçici hataları önleme, giderme, tanılama ve azaltma işlemleri açıklanır. Yeniden deneme mantığını yapılandırmayı, bağlantı dizesini oluşturmayı ve diğer bağlantı ayarlarını yapmayı öğrenin.

Geçici hatalar (geçici hatalar)

Geçici hata olarak da bilinen geçici bir hatanın, kısa süre içinde kendisini çözen temel bir nedeni vardır. Geçici hataların ara sıra bir nedeni, Azure sisteminin çeşitli iş yüklerini daha iyi yük dengelemek için donanım kaynaklarını hızla kaydırmasıdır. Bu yeniden yapılandırma olaylarının çoğu 60 saniyeden kısa bir süre içinde tamamlar. Bu yeniden yapılandırma süresi boyunca, SQL Veritabanı'de veritabanınıza bağlanırken sorunlarla karşılaşabilirsiniz. Veritabanınıza bağlanan uygulamalar bu geçici hataları bekleyecek şekilde derlenmelidir. Bunları işlemek için, uygulama hataları olarak kullanıcılara eklemek yerine kodlarında yeniden deneme mantığını uygulayın.

İstemci programınız ADO.NET kullanıyorsa, programınıza SqlException'ın atılmasıyla geçici hatadan bahsedilir.

Bağlantı ve komut karşılaştırması

Aşağıdakilere bağlı olarak SQL Veritabanı ve SQL Yönetilen Örneği bağlantısını yeniden deneyin veya yeniden kurun:

  • Bağlantı denemesi sırasında geçici bir hata oluşuyor

Birkaç saniyelik bir gecikmeden sonra bağlantıyı yeniden deneyin.

  • SQL Veritabanı ve SQL Yönetilen Örneği sorgu komutu sırasında geçici bir hata oluşur

Komutu hemen yeniden denemeyin. Bunun yerine, bir gecikmeden sonra bağlantıyı yeni bir şekilde kurun. Ardından komutu yeniden deneyin.

Geçici hatalar için yeniden deneme mantığı

Zaman zaman geçici bir hatayla karşılaşan istemci programları, yeniden deneme mantığı içerdiklerinde daha güçlü olur. Programınız üçüncü taraf ara yazılım aracılığıyla SQL Veritabanı veritabanınızla iletişim kurarken, satıcıya geçici hatalar için ara yazılımı yeniden deneme mantığı içerip içermediğini sorun.

Yeniden deneme ilkeleri

  • Hata geçiciyse bağlantıyı açmayı yeniden deneyin.
  • Geçici bir hatayla başarısız olan bir SQL Veritabanı veya SQL Yönetilen Örneği SELECT deyimini doğrudan yeniden denemeyin. Bunun yerine, yeni bir bağlantı kurun ve sonra yeniden SELECTdeneyin.
  • bir SQL Veritabanı veya SQL Yönetilen Örneği UPDATE deyimi geçici bir hatayla başarısız olduğunda, UPDATE'i yeniden denemeden önce yeni bir bağlantı kurun. Yeniden deneme mantığı, veritabanı işleminin tamamının tamamlandığından veya işlemin tamamının geri alındığından emin olmalıdır.

Yeniden denemeyle ilgili dikkat edilmesi gereken diğer noktalar

  • Çalışma saatlerinden sonra otomatik olarak başlayan ve sabah olmadan biten bir toplu iş programı, yeniden deneme girişimleri arasında uzun zaman aralıkları olan çok sabırlı olmayı göze alabilir.
  • Bir kullanıcı arabirimi programı, çok uzun bir süre bekledikten sonra insan eğiliminden vazgeçme eğilimini hesaba katmalıdır. Bu ilke sistemi isteklerle kaplayabileceğinden, çözümün birkaç saniyede bir yeniden denememesi gerekir.

Yeniden denemeler arasındaki aralık artışı

İlk yeniden denemenizden önce 5 saniye beklemenizi öneririz. 5 saniyeden kısa bir gecikmeden sonra yeniden deneme, bulut hizmetini bunaltma riski taşır. Sonraki her yeniden denemede gecikme üstel olarak artarak en fazla 60 saniyeye kadar uzaymalıdır.

ADO.NET kullanan istemcilerin engelleme süresiyle ilgili bir tartışma için bkz . Bağlantı havuzu (ADO.NET).

Ayrıca, program kendi kendini sonlandırmadan önce en fazla yeniden deneme sayısını ayarlamak isteyebilirsiniz.

Yeniden deneme mantığına sahip kod örnekleri

Yeniden deneme mantığına sahip kod örneklerine şu konumdan ulaşabilirsiniz:

Yeniden deneme mantığınızı test etme

Yeniden deneme mantığınızı test etmek için, programınız çalışmaya devam ederken düzeltilebilen bir hatanın benzetimini yapmalı veya hataya neden olmalısınız.

Ağ bağlantısını keserek test etme

Yeniden deneme mantığınızı test etmenin bir yolu, program çalışırken istemci bilgisayarınızın ağ bağlantısını kesmektir. Hata şudur:

  • SqlException.Number = 11001
  • İleti: "Böyle bir konak bilinmiyor"

İlk yeniden deneme denemesinin bir parçası olarak, istemci bilgisayarınızı ağa yeniden bağlayabilir ve sonra bağlanmayı deneyebilirsiniz.

Bu testi pratik hale getirmek için programınızı başlatmadan önce bilgisayarınızı ağdan çıkarın. Ardından programınız, programın aşağıdakilere neden olan bir çalışma zamanı parametresini tanır:

  • Geçici olarak göz önünde bulundurulacak hata listesine geçici olarak 11001 ekleyin.
  • İlk bağlantısını her zamanki gibi dene.
  • Hata yakalandıktan sonra listeden 11001'i kaldırın.
  • Kullanıcıya bilgisayarı ağa takmasını söyleyen bir ileti görüntüleyin.
  • Console.ReadLine yöntemini veya Tamam düğmesini içeren bir iletişim kutusunu kullanarak daha fazla yürütmeyi duraklatın. Bilgisayar ağa bağlandıktan sonra kullanıcı Enter tuşuna basar.
  • Bağlanmayı yeniden deneyin ve başarılı olmasını bekleyin.

Bağlanırken kullanıcı adını yanlış yazarak test edin

Programınız, ilk bağlantı girişiminden önce kullanıcı adını bilerek yanlış yanıtlayabilir. Hata şudur:

  • SqlException.Number = 18456
  • İleti: "'WRONG_MyUserName' kullanıcısı için oturum açma başarısız oldu."

İlk yeniden deneme denemesinin bir parçası olarak, programınız yazım hatalarını düzeltebilir ve bağlanmayı deneyebilir.

Bu testi pratik hale getirmek için programınız, programın şunları yapmasına neden olan bir çalışma zamanı parametresini tanır:

  • Geçici olarak göz önünde bulundurulacak hata listesine geçici olarak 18456 ekleyin.
  • Kullanıcı adına bilerek 'WRONG_' ekleyin.
  • Hata yakalandıktan sonra listeden 18456'yı kaldırın.
  • Kullanıcı adından 'WRONG_' öğesini kaldırın.
  • Bağlanmayı yeniden deneyin ve başarılı olmasını bekleyin.

Bağlantı yeniden denemesi için .NET SqlConnection parametreleri

İstemci programınız SQL Veritabanı'daki veritabanınıza System.Data.SqlClient.SqlConnection .NET Framework sınıfını kullanarak bağlanıyorsa, bağlantı yeniden deneme özelliğini kullanabilmeniz için .NET 4.6.1 veya sonraki bir sürümü (veya .NET Core) kullanın. Özellik hakkında daha fazla bilgi için bkz . SqlConnection.ConnectionString Özelliği.

SqlConnection nesneniz için bağlantı dizesini oluşturduğunuzda, değerleri aşağıdaki parametreler arasında koordine edin:

  • ConnectRetryCount: Varsayılan değer 1'dir. Aralık 0 ile 255 arasındadır.
  • ConnectRetryInterval: Varsayılan değer 10 saniyedir. Aralık 1 ile 60 arasındadır.
  • Bağlantı Zaman Aşımı: Varsayılan değer 15 saniyedir. Aralık 0 ile 2147483647 arasındadır.

Özellikle, seçtiğiniz değerler şu eşitliği doğru hale getirmelidir: Bağlantı Zaman Aşımı = ConnectRetryCount * ConnectionRetryInterval

Örneğin, sayı 3'e eşitse ve aralık 10 saniyeye eşitse, yalnızca 29 saniyelik bir zaman aşımı sisteme üçüncü ve son yeniden denemesinin bağlanması için yeterli zaman vermez: 29 < 3 * 10.

Bağlantı ve komut karşılaştırması

ConnectRetryCount ve ConnectRetryInterval parametreleri, SqlConnection nesnenizin, denetimi programınıza döndürmek gibi programınıza bildirmeden veya rahatsız etmeden bağlanma işlemini yeniden denemesine olanak tanır. Yeniden denemeler aşağıdaki durumlarda gerçekleşebilir:

  • SqlConnection.Open yöntemi çağrısı
  • SqlConnection.Execute yöntemi çağrısı

Bir incelik var. Sorgunuz yürütülürken geçici bir hata oluşursa, SqlConnection nesneniz bağlanma işlemini yeniden denemez. Sorgunuzu kesinlikle yeniden denemez. Ancak SqlConnection , sorgunuzu yürütme için göndermeden önce bağlantıyı çok hızlı bir şekilde denetler. Hızlı denetim bir bağlantı sorunu algılarsa , SqlConnection bağlanma işlemini yeniden dener. Yeniden deneme başarılı olursa sorgunuz yürütülmeye gönderilir.

ConnectRetryCount, uygulama yeniden deneme mantığıyla birleştirilmeli mi?

Uygulamanızın güçlü özel yeniden deneme mantığı olduğunu varsayalım. Bağlanma işlemini dört kez yeniden deneyebilir. Bağlantı dizenize ConnectRetryInterval ve ConnectRetryCount =3 eklerseniz, yeniden deneme sayısını 4 * 3 = 12 yeniden deneme olarak artırırsınız. Bu kadar çok sayıda yeniden denemeyi amaçlamayabilirsiniz.

SQL Veritabanı'da veritabanınıza bağlantılar

Bağlantı: Bağlantı dizesi

Veritabanınıza bağlanmak için gereken bağlantı dizesi, SQL Server bağlanmak için kullanılan dizeden biraz farklıdır. Veritabanınızın bağlantı dizesini Azure portal kopyalayabilirsiniz.

bağlantı dizesini Azure portal

İstemci programınızın Azure SQL Veritabanı ile etkileşim kurması için gereken bağlantı dizesini almak için Azure portal kullanın.

  1. Tüm hizmetler>SQL veritabanları'ı seçin.

  2. VERITABANınızın adını SQL veritabanları dikey penceresinin sol üst kısmındaki filtre metin kutusuna girin.

  3. Veritabanınızın satırını seçin.

  4. Veritabanınız için dikey pencere göründükten sonra, görsel kolaylık için Gözatma ve veritabanı filtreleme için kullandığınız dikey pencereleri daraltmak için Simge durumuna küçült düğmelerini seçin.

  5. Veritabanınızın dikey penceresinde Veritabanı bağlantı dizelerini göster'i seçin.

  6. Uygun bağlantı dizesini kopyalayın. Örneğin, ADO.NET bağlantı kitaplığını kullanmak istiyorsanız, ADO.NET sekmesinden uygun dizeyi kopyalayın.

    Veritabanınız için ADO bağlantı dizesini kopyalama

  7. Bağlantı dizesini gerektiği gibi düzenleyin. Örneğin, bağlantı dizesine parolanızı ekleyin veya kullanıcı adı veya sunucu adı> çok uzunsa kullanıcı adından "@<sunucuadı" öğesini kaldırın.

  8. Bir biçimde veya başka bir biçimde, bağlantı dizesi bilgilerini istemci program kodunuz içine yapıştırın.

Daha fazla bilgi için bkz . Bağlantı dizeleri ve yapılandırma dosyaları.

Bağlantı: IP adresi

İstemci programınızı barındıran bilgisayarın IP adresinden gelen iletişimi kabul etmek için SQL Veritabanı yapılandırmanız gerekir. Bu yapılandırmayı ayarlamak için Azure portal aracılığıyla güvenlik duvarı ayarlarını düzenleyin.

IP adresini yapılandırmayı unutursanız, programınız gerekli IP adresini belirten kullanışlı bir hata iletisiyle başarısız olur.

  1. Azure Portal oturum açın.

  2. Soldaki listeden Tüm hizmetler'i seçin.

  3. Ekranı kaydırıp SQL sunucuları'ı seçin.

    portalda Azure SQL Veritabanı sunucunuzu bulma

  4. Filtre metin kutusuna sunucunuzun adını yazmaya başlayın. Satırınız görüntülenir.

  5. Sunucunuzun satırını seçin. Sunucunuz için bir dikey pencere görüntülenir.

  6. Sunucu dikey pencerenizde Ayarlar'ı seçin.

  7. Güvenlik Duvarı'nı seçin.

    Ayarlar Güvenlik Duvarı'nı > seçin

  8. İstemci IP'sini Ekle'yi seçin. İlk metin kutusuna yeni kuralınız için bir ad yazın.

  9. Etkinleştirmek istediğiniz aralığın düşük ve yüksek IP adresi değerlerini yazın.

    • .0 ile düşük değer ucu ve .255 ile yüksek değer ucuna sahip olmak kullanışlı olabilir.
  10. Kaydet’i seçin.

Daha fazla bilgi için bkz. SQL Veritabanı güvenlik duvarı ayarlarını yapılandırma.

Bağlantı: Bağlantı noktaları

Genellikle, istemci programınızı barındıran bilgisayarda giden iletişim için yalnızca 1433 numaralı bağlantı noktasının açık olduğundan emin olmanız gerekir.

Örneğin, istemci programınız bir Windows bilgisayarda barındırıldığında, 1433 numaralı bağlantı noktasını açmak için konakta Windows Güvenlik Duvarı'nı kullanabilirsiniz.

  1. Denetim Masası'nı açın.
  2. Tüm Denetim Masası Öğeleri>Windows Güvenlik Duvarı>Gelişmiş Ayarlar>Giden Kuralları>Eylemler>Yeni Kural'ı seçin.

İstemci programınız bir Azure sanal makinesinde (VM) barındırılıyorsa, ADO.NET 4.5 ve SQL Veritabanı için 1433'in üzerindeki bağlantı noktaları'nı okuyun.

Veritabanınızdaki bağlantı noktalarının ve IP adreslerinin yapılandırması hakkında arka plan bilgileri için bkz. Veritabanı güvenlik duvarı Azure SQL.

Bağlantı: ADO.NET 4.6.2 veya üzeri

Programınız SQL Veritabanı bağlanmak için System.Data.SqlClient.SqlConnection gibi ADO.NET sınıfları kullanıyorsa, .NET Framework 4.6.2 veya sonraki bir sürümü kullanmanızı öneririz.

ADO.NET 4.6.2'den başlayarak

  • Bağlantı açma işlemi, Azure SQL için hemen yeniden denenerek bulut özellikli uygulamaların performansını artırmaya çalışır.

ADO.NET 4.6.1'den başlayarak

  • SQL Veritabanı için SqlConnection.Open yöntemini kullanarak bir bağlantı açtığınızda güvenilirlik artırılır. Open yöntemi artık bağlantı zaman aşımı süresi içinde belirli hatalar için geçici hatalara yanıt olarak en iyi çabayı gösteren yeniden deneme mekanizmalarını birleştirir.
  • Bağlantı havuzu desteklenir ve bu da programınıza verdiği bağlantı nesnesinin çalıştığının etkili bir doğrulamasını içerir.

Bağlantı havuzundan bir bağlantı nesnesi kullandığınızda, programınızın hemen kullanılmadığında bağlantıyı geçici olarak kapatmasını öneririz. Bağlantıyı yeniden açmak pahalı değildir, ancak yeni bir bağlantı oluşturmaktır.

ADO.NET 4.0 veya önceki bir sürümü kullanıyorsanız en son ADO.NET yükseltmenizi öneririz. Ağustos 2018 itibarıyla 4.6.2 ADO.NET indirebilirsiniz.

Tanılama

Tanılama: Yardımcı programların bağlanıp bağlanamayacağını test edin

Programınız SQL Veritabanı'da veritabanınıza bağlanamıyorsa, tanılama seçeneklerin biri bir yardımcı programla bağlanmayı denemektir. İdeal olan, yardımcı programınızın kullandığı kitaplığı kullanarak bağlanır.

Herhangi bir Windows bilgisayarında şu yardımcı programları deneyebilirsiniz:

  • ADO.NET kullanarak bağlanan SQL Server Management Studio (ssms.exe)
  • sqlcmd.exe, ODBC kullanarak bağlanır

Programınız bağlandıktan sonra kısa bir SQL SELECT sorgusu çalışıp çalışmadığını test edin.

Tanılama: Açık bağlantı noktalarını denetleyin

Bağlantı noktası sorunları nedeniyle bağlantı girişimlerinin başarısız olduğundan şüpheleniyorsanız, bilgisayarınızda bağlantı noktası yapılandırmalarını bildiren bir yardımcı program çalıştırabilirsiniz.

Linux'ta aşağıdaki yardımcı programlar yararlı olabilir:

  • netstat -nap
  • nmap -sS -O 127.0.0.1: Örnek değeri IP adresiniz olarak değiştirin.

Windows'da PortQry.exe yardımcı programı yararlı olabilir. SQL Veritabanı'daki bir veritabanında bağlantı noktası durumunu sorgulayan ve bir dizüstü bilgisayarda çalıştırılan örnek yürütme aşağıda verilmiştir:

[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\]
>>

Tanılama: Hatalarınızı günlüğe kaydetme

Aralıklı bir sorun bazen en iyi zaman zaman genel bir desenin günler veya haftalar içinde algılanmasıyla tanılanır.

İstemciniz, karşılaştığı tüm hataları günlüğe yazarak tanılamaya yardımcı olabilir. Günlük girdilerini, kendisini dahili olarak günlüğe SQL Veritabanı hata verileriyle ilişkilendirebilirsiniz.

Enterprise Library 6 (EntLib60), günlüğe kaydetmeye yardımcı olmak için .NET yönetilen sınıfları sunar. Daha fazla bilgi için bkz . 5 - Günlükten düşmek kadar kolay: Günlük Uygulama Bloğunu kullanma.

Tanılama: Sistem günlüklerinde hataları inceleme

Burada hata günlüklerini ve diğer bilgileri sorgulayan bazı Transact-SQL SELECT deyimleri yer alır.

Günlük sorgusu Açıklama
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;
sys.event_log görünümü, geçici hatalara veya bağlantı hatalarına neden olabilecek olayları içeren tek tek olaylar hakkında bilgi sunar.

İdeal olarak, start_time veya end_time değerlerini istemci programınızın ne zaman sorun yaşadığıyla ilgili bilgilerle ilişkilendirebilirsiniz.

Bu sorguyu çalıştırmak için ana veritabanına bağlanmanız gerekir.
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;
sys.database_connection_stats görünümü ek tanılama için olay türlerinin toplam sayısını sunar.

Bu sorguyu çalıştırmak için ana veritabanına bağlanmanız gerekir.

Tanılama: SQL Veritabanı günlüğünde sorun olaylarını arama

sorun olaylarıyla ilgili girdileri SQL Veritabanı günlüğünde arayabilirsiniz. Ana veritabanında aşağıdaki Transact-SQL SELECT deyimini deneyin:

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
;

sys.fn_xe_telemetry_blob_target_read_file'dan döndürülen birkaç satır

Aşağıdaki örnek, döndürülen satırın nasıl görünebileceğini gösterir. Gösterilen null değerler genellikle diğer satırlarda null değildir.

object_name                   timestamp                    error  state  is_success  database_name

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

Kurumsal Kitaplık 6

Kurumsal Kitaplık 6 (EntLib60), bulut hizmetlerinin güçlü istemcilerini uygulamanıza yardımcı olan bir .NET sınıfları çerçevesidir ve bunlardan biri de SQL Veritabanı. EntLib60'ın yardımcı olabileceği her alana ayrılmış konuları bulmak için bkz. Kurumsal Kitaplık 6 - Nisan 2013.

Geçici hataları işlemek için yeniden deneme mantığı, EntLib60'ın yardımcı olabileceği alanlardan biridir. Daha fazla bilgi için bkz . 4 - Azim, tüm zaferlerin gizli dizisi: Geçici Hata İşleme Uygulama Bloğunu kullanma.

Not

EntLib60'ın kaynak kodu İndirme Merkezi'nden genel olarak indirilebilir. Microsoft'un EntLib'de başka özellik güncelleştirmeleri veya bakım güncelleştirmeleri yapma planı yoktur.

Geçici hatalar için EntLib60 sınıfları ve yeniden deneme

Aşağıdaki EntLib60 sınıfları, yeniden deneme mantığı için özellikle yararlıdır. Tüm bu sınıflar Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling ad alanında veya altında bulunur.

Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling ad alanında:

  • RetryPolicy sınıfı
    • ExecuteAction yöntemi
  • ExponentialBackoff sınıfı
  • SqlDatabaseTransientErrorDetectionStrategy sınıfı
  • ReliableSqlConnection sınıfı
    • ExecuteCommand yöntemi

Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.TestSupport ad alanında:

  • AlwaysTransientErrorDetectionStrategy sınıfı
  • NeverTransientErrorDetectionStrategy sınıfı

EntLib60 hakkındaki bilgilerin bazı bağlantıları şunlardır:

EntLib60: Günlük bloğu

  • Günlük bloğu, aşağıdakileri yapmak için kullanabileceğiniz son derece esnek ve yapılandırılabilir bir çözümdür:
    • Günlük iletilerini çok çeşitli konumlarda oluşturun ve depolayın.
    • İletileri kategorilere ayırma ve filtreleme.
    • Hata ayıklama ve izlemenin yanı sıra denetim ve genel günlük gereksinimleri için yararlı olan bağlamsal bilgileri toplayın.
  • Günlük bloğu, uygulama kodunun hedef günlük deposunun konumuna ve türüne bakılmadan tutarlı olması için günlük işlevini günlük hedefinden soyutlar.

Daha fazla bilgi için bkz . 5 - Günlükten düşmek kadar kolay: Günlük Uygulama Bloğunu kullanma.

EntLib60 IsTransient yöntemi kaynak kodu

Ardından , SqlDatabaseTransientErrorDetectionStrategysınıfından IsTransient yönteminin C# kaynak kodudur. Kaynak kodu, Nisan 2013 itibarıyla hangi hataların geçici olarak kabul edildiğini ve yeniden denenebileceğini açıklar.

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

Sonraki adımlar

Ayrıca bkz.