Aracılığıyla paylaş


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şime geçtiğinde karşılaştığı bağlantı hatalarını ve geçici hataları önleme, giderme, tanılama ve azaltma işlemleri açıklanmaktadır. Yeniden deneme mantığını yapılandırmayı, bağlantı dizesi 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. Bazı durumlarda geçici hataların nedeni Azure sisteminin çeşitli iş yüklerini daha iyi dengelemek amacıyla donanım kaynaklarını hızla kaydırmasıdır. Bu yeniden yapılandırma olaylarının çoğu 60 saniyeden daha kısa sürede tamamlanır. Bu yeniden yapılandırma süresi boyunca veritabanınızı SQL Veritabanı'na bağlarken sorunlarla karşılaşabilirsiniz. Veritabanınıza bağlanan uygulamalar bu geçici hataları bekleyecek şekilde oluşturulmalıdır. Bunları işlemek için, bu hataları kullanıcılara uygulama hatası olarak göstermek yerine kodlarında yeniden deneme mantığı 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 komutunu yeniden deneyin.

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

Arada sırada geçici bir hatayla karşılaşan istemci programları, yeniden deneme mantığı içerdiğinde 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ın 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 yeniden deneyin SELECT.
  • 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 denemek için 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ı olabilir.
  • Bir kullanıcı arabirimi programı, çok uzun bir süre bekledikten sonra vazgeçen insan eğilimini hesaba katmalıdır. Bu ilke sistemi isteklerle dolup taşabileceğ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 saniye olmalıdır.

ADO.NET kullanan istemciler için engelleme süresiyle ilgili bir tartışma için bkz . Bağlantı havuzu oluşturma (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 edin

Yeniden deneme mantığınızı test etmek için, programınız çalışmaya devam ederken düzeltilebilen bir hatanın benzetimini yapmalı veya bu 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 ardından 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 deneme.
  • 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 yürütmeyi duraklatın. Kullanıcı, bilgisayar ağa takılıyken Enter tuşuna basar.
  • Başarılı olmak için yeniden bağlanmayı deneyin.

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çılamadı."

İ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 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 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şarılı olmak için yeniden bağlanmayı deneyin.

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

İstemci programınız Azure 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. Bu özellik hakkında daha fazla bilgi için bkz . SqlConnection.ConnectionString Özelliği.

SqlConnection nesneniz için bağlantı dizesi 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.
  • Komut Zaman Aşımı: Varsayılan değer 30 saniyedir. Aralık 0 ile 2147483647 arasındadır.

Bağlantı yeniden deneme ayarları (ConnectRetryCount ve ConnectRetryInterval) bağlantı dayanıklılığı için geçerlidir. Bağlantı dayanıklılığı aşağıdaki benzersiz türleri içerir:

  • Açık bağlantı dayanıklılığı, ilk SqlConnection.Open veya OpenAsync() yöntemine başvurur. İlk bağlantı denemesi, deneme sıfır olarak sayılır. ConnectRetryCount sonraki yeniden denemeler için geçerlidir. Bu nedenle, bağlantı sıfırı başarısız olursa (bu hemen gerçekleşmeyebilir), ConnectRetryInterval önce uygulanır ve ardından sonraki ConnectRetryCount (ve ConnectRetryInterval) denemeleri uygulanır. Tüm yeniden deneme girişimlerinden yararlanmak için Bağlantı Zaman Aşımı özelliğinin tüm denemeler için zaman sağlaması gerekir.

  • Boşta bağlantı dayanıklılığı, bozuk olan mevcut boşta bağlantıların otomatik olarak algılanması ve yeniden bağlanması anlamına gelir. Bozuk boşta bağlantıyı yeniden bağlama girişimi ilk yeniden deneme denemesi olarak sayılır. Tüm yeniden deneme girişimlerinden yararlanmak için, Komut Zaman Aşımı'nın tüm denemeler için zaman sağlaması gerekir.

Örnek: ConnectRetryCount ve ConnectRetryInterval parametreleri için aşağıdaki değerleri varsayın:

ConnectRetryCount: 3 ConnectRetryInterval: 10 saniye

Aşağıdaki senaryolarda bu değerlerin nasıl kullanıldığını görün:

Senaryo: Yeni bağlantı

4:10:00 - Connection.Open() - sıfır denemesi

4:10:01 - Bağlantı hatası algılandı

4:10:11 - Yeniden Deneme 1 --> İlk yeniden deneme ConnectRetryInterval sonrasında gerçekleşir

4:10:21 - Yeniden Deneme 2

4:10:31 - Yeniden Deneme 3

Bu senaryo için seçtiğiniz değerler aşağıdaki koşulu karşılamalıdır:
Connection Timeout > = ConnectRetryCount * ConnectionRetryInterval

Örneğin, sayı 3 ve aralık 10 saniye ise, yalnızca 29 saniyelik bir zaman aşımı sistemin üçüncü ve son yeniden denemesinin bağlanması için yeterli zaman sağlamaz:

29 < 3 * 10

Senaryo: Boşta bağlantı

ConnectRetryCount: 3 ConnectRetryInterval: 10 saniye

4:10:00 - Komut yürütmede kopuk bağlantı algılandı

4:10:00 - Yeniden Deneme 1 -->İlk yeniden deneme hemen gerçekleşir

4:10:10 - Yeniden Deneme 2

4:10:20 - Yeniden Deneme 3

Bu ilk bağlantı değil. Bu nedenle, Bağlantı Zaman Aşımı uygulanmaz. Ancak, bağlantı kurtarma komut yürütme sırasında gerçekleştiğinden, Komut Zaman Aşımı ayarı geçerli olur. Komut Zaman Aşımı varsayılanı 30 saniyedir. Bağlantı kurtarma tipik durumlarda hızlı olsa da, aralıklı bir kesinti, kurtarmanın komut yürütme süresinin bir kısmını almasına neden olabilir.

Bu senaryoda, boşta bağlantı kurtarma yeniden denemelerinden tam olarak yararlanmak istiyorsanız, seçtiğiniz değerler aşağıdaki koşulu karşılamalıdır:
Command Timeout > (ConnectRetryCount - 1) * ConnectionRetryInterval

Örneğin, sayı 3 ve aralık 10 saniye ise, 20 saniyeden düşük bir komut zaman aşımı değeri üçüncü ve son yeniden denemenin bağlanması için yeterli zaman vermez: (3 - 1) * 10 = 20'

Ayrıca, bağlantı kurtarıldıktan sonra komutun yürütülmesi için zaman gerektirdiğini de göz önünde bulundurun.

Not

Bu senaryolarda sağlanan süre değerleri yalnızca gösterim içindir. Her iki senaryoda da gerçek algılama süreleri, temel alınan altyapıya bağlıdır.

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öntem çağrısı
  • SqlConnection.Execute yöntem ç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ütme için 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. connectRetryInterval ve ConnectRetryCount =3 değerlerini bağlantı dizesi eklerseniz, yeniden deneme sayısını 4 * 3 = 12 yeniden denemeye yükseltirsiniz. Bu kadar fazla sayıda yeniden deneme yapmayı 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'a bağlanmak için kullanılan dizeden biraz farklıdır. Veritabanınızın bağlantı dizesi Azure portalından kopyalayabilirsiniz.

Azure portalından bağlantı dizesi edinme

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

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

  2. VERITABANınızın adını SQL veritabanları bölmesinin 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 bölme göründükten sonra, görsel kolaylık sağlamak 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 bölmesinde Veritabanı bağlantı dizesi göster'i seçin.

  6. Uygun bağlantı dizesi 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ı dizesi kopyalama

  7. bağlantı dizesi gerektiği gibi düzenleyin. Örneğin, parolanızı bağlantı dizesi 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 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’ında 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 bölme görüntülenir.

  6. Sunucu bölmenizde 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 ucuna 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ı'da 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ı>Eylemleri>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 ötesindeki 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. Azure SQL Veritabanı güvenlik duvarı.

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 sürüm 4.6.2 veya üzerini kullanmanızı öneririz.

ADO.NET 4.6.2 ile başlayarak

  • Bağlantı açma işlemi Azure SQL için hemen yeniden denenmeye çalışılır ve böylece bulut özellikli uygulamaların performansı iyileştirilir.

ADO.NET 4.6.1 ile 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, programınıza verdiği bağlantı nesnesinin çalıştığını verimli bir şekilde doğrulamayı 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ğlanamazsa bir tanılama seçeneği 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 olacak şekilde 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 genel bir desenin günler veya haftalar içinde algılanmasıyla en iyi şekilde tanılanır.

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

Kurumsal Kitaplık 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 bazı 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 birkaç satır döndürüldü

Aşağıdaki örnekte, döndürülen bir satırın nasıl görünebileceği gösterilmektedir. 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

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

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 - Sebat, 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ırın ve filtreleyin.
    • 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 günlük hedefinden günlük işlevini soyutlar, böylece uygulama kodu tutarlı olur ve hedef günlük deposunun konumuna ve türüne bakılmaz.

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, SqlDatabaseTransientErrorDetectionStrategy sınıfından IsTransient yönteminin C# kaynak kodudur. Kaynak kodu, hangi hataların geçici olarak kabul edildiğini ve yeniden denenebilir olduğunu belirtir.

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