Tijdelijke verbindingsfouten in SQL Database en SQL Managed Instance oplossen

Van toepassing op: Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics

In dit artikel wordt beschreven hoe u verbindingsfouten en tijdelijke fouten die optreden bij interactie met Azure SQL Database, Azure SQL Managed Instance en Azure Synapse Analytics, kunt voorkomen, oplossen en beperken. Meer informatie over het configureren van logica voor opnieuw proberen, het bouwen van de verbindingsreeks en het aanpassen van andere verbindingsinstellingen.

Tijdelijke fouten (tijdelijke fouten)

Een tijdelijke fout, ook wel een tijdelijke fout genoemd, heeft een onderliggende oorzaak die zichzelf snel oplost. Een incidentele oorzaak van tijdelijke fouten is wanneer het Azure-systeem snel hardwareresources verschuift om verschillende workloads beter te verdelen. De meeste van deze herconfiguratie-gebeurtenissen worden in minder dan 60 seconden voltooid. Tijdens deze herconfiguratie kunnen er problemen optreden met het maken van verbinding met uw database in SQL Database. Toepassingen die verbinding maken met uw database, moeten zo worden gebouwd dat ze deze tijdelijke fouten verwachten. Als u ze wilt afhandelen, implementeert u logica voor opnieuw proberen in hun code in plaats van ze als toepassingsfouten aan gebruikers te laten zien.

Als uw clientprogramma gebruikmaakt van ADO.NET, wordt uw programma verteld over de tijdelijke fout door sqlException te gooien.

Verbinding maken ion versus opdracht

Probeer de verbinding met SQL Database en SQL Managed Instance opnieuw of maak deze opnieuw, afhankelijk van het volgende:

  • Er treedt een tijdelijke fout op tijdens een verbinding

Voer na een vertraging van enkele seconden de verbinding opnieuw uit.

  • Er treedt een tijdelijke fout op tijdens een sql Database- en SQL Managed Instance-queryopdracht

Voer de opdracht niet onmiddellijk opnieuw uit. In plaats daarvan brengt u na een vertraging de verbinding tot stand. Voer vervolgens de opdracht opnieuw uit.

Pogingslogica voor tijdelijke problemen

Clientprogramma's die af en toe een tijdelijke fout tegenkomen, zijn robuuster wanneer ze logica voor opnieuw proberen bevatten. Wanneer uw programma communiceert met uw database in SQL Database via middleware van derden, vraagt u de leverancier of de middleware logica voor opnieuw proberen bevat voor tijdelijke fouten.

Principes voor opnieuw proberen

  • Als de fout tijdelijk is, probeert u opnieuw een verbinding te openen.
  • Probeer niet rechtstreeks opnieuw een SQL Database- of SQL Managed Instance-instructie SELECT die is mislukt met een tijdelijke fout. Maak in plaats daarvan een nieuwe verbinding en probeer het SELECTopnieuw.
  • Wanneer een SQL Database- of SQL Managed Instance-instructie UPDATE mislukt met een tijdelijke fout, moet u een nieuwe verbinding tot stand brengen voordat u de UPDATE opnieuw probeert uit te voeren. De logica voor opnieuw proberen moet ervoor zorgen dat de volledige databasetransactie is voltooid of dat de hele transactie wordt teruggedraaid.

Andere overwegingen voor opnieuw proberen

  • Een batchprogramma dat automatisch begint na werkuren en eindigt vóór de ochtend, kan het zich veroorloven om zeer geduldig te zijn met lange tijdsintervallen tussen de nieuwe pogingen.
  • Een gebruikersinterfaceprogramma moet rekening houden met de menselijke neiging om na te lange wachttijden op te geven. De oplossing mag niet elke paar seconden opnieuw proberen, omdat dat beleid het systeem kan overspoelen met aanvragen.

Intervalverhoging tussen nieuwe pogingen

U wordt aangeraden vijf seconden te wachten voordat u het eerst opnieuw probeert. Het opnieuw proberen na een vertraging van minder dan 5 seconden kan de cloudservice overweldigen. Voor elke volgende nieuwe poging moet de vertraging exponentieel toenemen, tot maximaal 60 seconden.

Zie Verbinding maken ion pooling (ADO.NET) voor een bespreking van de blokkeringsperiode voor clients die gebruikmaken van ADO.NET.

U kunt ook een maximum aantal nieuwe pogingen instellen voordat het programma zelf wordt beëindigd.

Codevoorbeelden met logica voor opnieuw proberen

Codevoorbeelden met logica voor opnieuw proberen zijn beschikbaar op:

Uw logica voor opnieuw proberen testen

Als u de logica voor opnieuw proberen wilt testen, moet u een fout simuleren of veroorzaken die kan worden gecorrigeerd terwijl uw programma nog steeds wordt uitgevoerd.

Testen door de verbinding met het netwerk te verbreken

Een manier waarop u de logica voor opnieuw proberen kunt testen, is door de verbinding van uw clientcomputer met het netwerk te verbreken terwijl het programma wordt uitgevoerd. De fout is:

  • SqlException.Number = 11001
  • Bericht: "Er is geen dergelijke host bekend"

Als onderdeel van de eerste poging om opnieuw te proberen, kunt u de clientcomputer opnieuw verbinden met het netwerk en vervolgens proberen verbinding te maken.

Als u deze test praktisch wilt maken, koppelt u de computer los van het netwerk voordat u het programma start. Vervolgens herkent uw programma een runtimeparameter die ervoor zorgt dat het programma:

  • Voeg tijdelijk 11001 toe aan de lijst met fouten die moeten worden overwogen als tijdelijk.
  • Probeer de eerste verbinding zoals gebruikelijk.
  • Nadat de fout is opgetreden, verwijdert u 11001 uit de lijst.
  • Geef een bericht weer waarmee de gebruiker de computer moet aansluiten op het netwerk.
  • Onderbreek de verdere uitvoering met behulp van de methode Console.ReadLine of een dialoogvenster met een knop OK. De gebruiker drukt op de Enter-toets nadat de computer is aangesloten op het netwerk.
  • Probeer opnieuw verbinding te maken, verwacht succes.

Testen door de gebruikersnaam verkeerd te spelen bij het verbinden

Uw programma kan de gebruikersnaam opzettelijk verkeerd spelen vóór de eerste verbindingspoging. De fout is:

  • SqlException.Number = 18456
  • Bericht: 'Aanmelden is mislukt voor gebruiker 'WRONG_MyUserName'.

Als onderdeel van de eerste poging om het opnieuw te proberen, kan uw programma de spelfout corrigeren en vervolgens proberen verbinding te maken.

Om deze test praktisch te maken, herkent uw programma een runtimeparameter die ervoor zorgt dat het programma:

  • Voeg tijdelijk 18456 toe aan de lijst met fouten die moeten worden overwogen als tijdelijk.
  • Voeg doellijk 'WRONG_' toe aan de gebruikersnaam.
  • Nadat de fout is opgetreden, verwijdert u 18456 uit de lijst.
  • Verwijder 'WRONG_' uit de gebruikersnaam.
  • Probeer opnieuw verbinding te maken, verwacht succes.

.NET Sql Verbinding maken ion-parameters voor opnieuw proberen van verbinding

Als uw clientprogramma verbinding maakt met uw database in Azure SQL Database met behulp van de .NET Framework-klasse System.Data.SqlClient.Sql Verbinding maken ion, gebruikt u .NET 4.6.1 of een nieuwere versie (of .NET Core), zodat u de functie voor het opnieuw proberen van de verbinding kunt gebruiken. Zie Sql Verbinding maken ion.Verbinding maken voor meer informatie over deze functieionString Eigenschap.

Wanneer u de verbindingsreeks voor uw Sql Verbinding maken ion-object bouwt, coördineert u de waarden tussen de volgende parameters:

  • Verbinding maken RetryCount: De standaardwaarde is 1. Het bereik is 0 tot en met 255.
  • Verbinding maken RetryInterval: De standaardwaarde is 10 seconden. Het bereik is 1 tot en met 60.
  • Verbinding maken iontime-out: de standaardwaarde is 15 seconden. Het bereik is 0 tot 2147483647.
  • Time-out van opdracht: de standaardwaarde is 30 seconden. Het bereik is 0 tot 2147483647.

De instellingen voor opnieuw proberen van de verbinding (Verbinding maken RetryCount en Verbinding maken RetryInterval) zijn van toepassing op verbindingstolerantie. Verbinding maken ietolerantie omvat de volgende verschillende typen:

  • Open verbindingstolerantie verwijst naar de eerste Sql Verbinding maken ion. Methode Open of OpenAsync(). De eerste verbindingspoging wordt geteld als try zero. Verbinding maken RetryCount is van toepassing op volgende nieuwe pogingen. Als de verbinding nul mislukt (dit kan niet onmiddellijk gebeuren), wordt Verbinding maken RetryInterval eerst toegepast, gevolgd door volgende pogingen Verbinding maken RetryCount (en Verbinding maken RetryInterval). Als u wilt profiteren van alle nieuwe pogingen, moet de eigenschap Verbinding maken ion Timeout tijd bieden voor alle pogingen.

  • Niet-actieve verbindingstolerantie verwijst naar de automatische detectie en opnieuw verbinding maken van bestaande niet-actieve verbindingen die zijn verbroken. De eerste poging om opnieuw verbinding te maken met een verbroken niet-actieve verbinding wordt geteld als de eerste poging om opnieuw te proberen. Als u wilt profiteren van alle nieuwe pogingen, moet de time-out van de opdracht tijd bieden voor alle pogingen.

Voorbeeld: Stel de volgende waarden voor de parameters Verbinding maken RetryCount en Verbinding maken RetryInterval:

Verbinding maken RetryCount: 3 Verbinding maken RetryInterval: 10 seconden

Bekijk hoe deze waarden worden gebruikt in de volgende scenario's:

Scenario: Nieuwe verbinding

4:10:00 - Verbinding maken ion. Open() - nulpoging

4:10:01 - Verbinding maken ionfout gedetecteerd

4:10:11 - Opnieuw proberen 1 --> Eerste poging vindt plaats na Verbinding maken RetryInterval

4:10:21 - Opnieuw proberen 2

4:10:31 - Opnieuw proberen 3

Voor dit scenario moeten uw gekozen waarden voldoen aan de volgende voorwaarde:
Connection Timeout > = ConnectRetryCount * ConnectionRetryInterval

Als het aantal bijvoorbeeld 3 is en het interval 10 seconden is, biedt een time-out van slechts 29 seconden onvoldoende tijd voor de derde en laatste poging om verbinding te maken:

29 < 3 * 10

Scenario: Niet-actieve verbinding

Verbinding maken RetryCount: 3 Verbinding maken RetryInterval: 10 seconden

4:10:00 - Verbroken verbinding gedetecteerd bij opdrachtuitvoering

4:10:00 - Opnieuw proberen 1 --Eerste> nieuwe poging vindt onmiddellijk plaats

4:10:10 - Opnieuw proberen 2

4:10:20 - Probeer het opnieuw 3

Dit is niet de eerste verbinding. Daarom is Verbinding maken ietime-out niet van toepassing. Omdat het verbindingsherstel echter plaatsvindt tijdens het uitvoeren van de opdracht, is de instelling Time-out van de opdracht van toepassing. De standaardinstelling voor de time-out van de opdracht is 30 seconden. Hoewel het herstel van de verbinding in typische omstandigheden snel is, kan een onregelmatige storing ertoe leiden dat het herstel een deel van de uitvoeringstijd van de opdracht in beslag neemt.

Als u voor dit scenario optimaal gebruik wilt maken van nieuwe pogingen voor het herstellen van niet-actieve verbindingen, moeten de gekozen waarden voldoen aan de volgende voorwaarde:
Command Timeout > (ConnectRetryCount - 1) * ConnectionRetryInterval

Als het aantal bijvoorbeeld 3 is en het interval 10 seconden is, geeft een time-outwaarde van een opdracht lager dan 20 seconden niet voldoende tijd voor de derde en laatste poging om opnieuw verbinding te maken: (3 - 1) * 10 = 20'

Houd er ook rekening mee dat de opdracht zelf tijd nodig heeft om uit te voeren nadat de verbinding is hersteld.

Notitie

De duurwaarden die in deze scenario's worden opgegeven, zijn alleen bedoeld voor demonstratie. De werkelijke detectietijden in beide scenario's zijn afhankelijk van de onderliggende infrastructuur.

Verbinding maken ion versus opdracht

Met de parameters Verbinding maken RetryCount en Verbinding maken RetryInterval kunnen uw Sql Verbinding maken ion-object de verbindingsbewerking opnieuw proberen zonder uw programma te vertellen of te storen, zoals het retourneren van de besturing naar uw programma. De nieuwe pogingen kunnen zich voordoen in de volgende situaties:

  • Sql Verbinding maken ion. Methode-aanroep openen
  • Sql Verbinding maken ion. Methode-aanroep uitvoeren

Er is een subtiliteit. Als er een tijdelijke fout optreedt tijdens het uitvoeren van uw query, wordt de verbindingsbewerking niet opnieuw uitgevoerd door uw Sql Verbinding maken ion-object. Uw query wordt zeker niet opnieuw geprobeerd. Sql Verbinding maken ion controleert echter zeer snel de verbinding voordat uw query voor uitvoering wordt verzonden. Als de snelle controle een verbindingsprobleem detecteert, probeert Sql Verbinding maken ion de verbindingsbewerking opnieuw uit te voeren. Als het opnieuw proberen lukt, wordt uw query verzonden voor uitvoering.

Moet Verbinding maken RetryCount worden gecombineerd met logica voor opnieuw proberen van toepassingen

Stel dat uw toepassing robuuste aangepaste logica voor opnieuw proberen heeft. Het kan vier keer opnieuw proberen om verbinding te maken. Als u Verbinding maken RetryInterval en Verbinding maken RetryCount =3 toevoegt aan uw verbindingsreeks, verhoogt u het aantal nieuwe pogingen naar 4 * 3 = 12 nieuwe pogingen. Mogelijk bent u niet van plan om zo'n groot aantal nieuwe pogingen uit te voeren.

Verbinding maken ies naar uw database in SQL Database

Verbinding maken ion: Verbinding maken iontekenreeks

De verbindingsreeks die nodig is om verbinding te maken met uw database, verschilt enigszins van de tekenreeks die wordt gebruikt om verbinding te maken met SQL Server. U kunt de verbindingsreeks voor uw database kopiëren vanuit Azure Portal.

De verbindingsreeks verkrijgen via Azure Portal

Gebruik Azure Portal om de verbindingsreeks te verkrijgen die nodig is voor uw clientprogramma om te communiceren met Azure SQL Database.

  1. Selecteer Alle SERVICES>SQL-databases.

  2. Voer de naam van uw database in het filtertekstvak in de linkerbovenhoek van de blade SQL-databases in.

  3. Selecteer de rij voor uw database.

  4. Nadat de blade voor uw database wordt weergegeven, selecteert u voor het gemak de knoppen Minimaliseren om de blades samen te vouwen die u hebt gebruikt voor bladeren en filteren van databases.

  5. Selecteer Database-verbindingsreeks s weergeven op de blade voor uw database.

  6. Kopieer de juiste verbindingsreeks. Als u de ADO.NET verbindingsbibliotheek wilt gebruiken, kopieert u de juiste tekenreeks vanaf het tabblad ADO.NET .

    Copy the ADO connection string for your database

  7. Bewerk de verbindingsreeks indien nodig. Dat wil bijvoorbeeld uw wachtwoord invoegen in de verbindingsreeks of "@<servername>" verwijderen uit de gebruikersnaam als de gebruikersnaam of servernaam te lang is.

  8. Plak in de ene indeling of in een andere indeling de verbindingsreeks gegevens in de code van het clientprogramma.

Zie Verbinding maken iontekenreeksen en configuratiebestanden voor meer informatie.

Verbinding maken ion: IP-adres

U moet SQL Database configureren om communicatie te accepteren vanaf het IP-adres van de computer die als host fungeert voor uw clientprogramma. Als u deze configuratie wilt instellen, bewerkt u de firewallinstellingen via Azure Portal.

Als u vergeet het IP-adres te configureren, mislukt uw programma met een handig foutbericht waarin het benodigde IP-adres wordt vermeld.

  1. Meld u aan bij de Azure-portal.

  2. Selecteer Alle services in de lijst aan de linkerkant.

  3. Schuif en selecteer SQL-servers.

    Find your Azure SQL Database server in the portal

  4. Begin in het filtertekstvak de naam van de server te typen. De rij wordt weergegeven.

  5. Selecteer de rij voor uw server. Er wordt een blade voor uw server weergegeven.

  6. Selecteer Instellingen op de serverblade.

  7. Selecteer Firewall.

    Select Settings > Firewall

  8. Selecteer Client-IP toevoegen. Typ een naam voor de nieuwe regel in het eerste tekstvak.

  9. Typ de waarden voor lage en hoge IP-adressen voor het bereik dat u wilt inschakelen.

    • Het kan handig zijn om de lage waarde te laten eindigen met .0 en de hoge waarde met .255.
  10. Selecteer Opslaan.

Zie Firewallinstellingen configureren in SQL Database voor meer informatie.

Verbinding maken ion: poorten

Normaal gesproken moet u ervoor zorgen dat alleen poort 1433 is geopend voor uitgaande communicatie op de computer die als host fungeert voor uw clientprogramma.

Wanneer uw clientprogramma bijvoorbeeld wordt gehost op een Windows-computer, kunt u Windows Firewall op de host gebruiken om poort 1433 te openen.

  1. Open het Configuratiescherm.
  2. Selecteer Alle Configuratiescherm items>die windows Firewall>Advanced Instellingen> Outbound Rules>Actions>New Rule.

Als uw clientprogramma wordt gehost op een virtuele Azure-machine (VM), leest u poorten na 1433 voor ADO.NET 4.5 en SQL Database.

Zie De Firewall van Azure SQL Database voor achtergrondinformatie over de configuratie van poorten en IP-adressen in uw database.

Verbinding maken ion: ADO.NET 4.6.2 of hoger

Als uw programma gebruikmaakt van ADO.NET klassen zoals System.Data.SqlClient.Sql Verbinding maken ion om verbinding te maken met SQL Database, raden we u aan .NET Framework versie 4.6.2 of hoger te gebruiken.

Beginnend met ADO.NET 4.6.2

  • De poging om verbinding te openen, wordt onmiddellijk opnieuw geprobeerd voor Azure SQL, waardoor de prestaties van cloud-apps worden verbeterd.

Beginnend met ADO.NET 4.6.1

  • Voor SQL Database wordt de betrouwbaarheid verbeterd wanneer u een verbinding opent met behulp van sql Verbinding maken ion. Methode Openen. De methode Open bevat nu mechanismen voor opnieuw proberen die het beste worden uitgevoerd als reactie op tijdelijke fouten voor bepaalde fouten binnen de time-outperiode van de verbinding.
  • Verbinding maken ion-pooling wordt ondersteund. Dit omvat een efficiënte verificatie dat het verbindingsobject dat uw programma biedt, functioneert.

Wanneer u een verbindingsobject uit een verbindingsgroep gebruikt, raden we u aan dat uw programma de verbinding tijdelijk sluit wanneer deze niet onmiddellijk in gebruik is. Het is niet duur om een verbinding opnieuw te openen, maar het is om een nieuwe verbinding te maken.

Als u ADO.NET 4.0 of eerder gebruikt, raden we u aan een upgrade uit te voeren naar de nieuwste ADO.NET. Vanaf augustus 2018 kunt u ADO.NET 4.6.2 downloaden.

Diagnostiek

Diagnostische gegevens: testen of hulpprogramma's verbinding kunnen maken

Als uw programma geen verbinding kan maken met uw database in SQL Database, kunt u een diagnostische optie gebruiken om verbinding te maken met een hulpprogramma. In het ideale voorbeeld maakt het hulpprogramma verbinding met behulp van dezelfde bibliotheek die door uw programma wordt gebruikt.

Op elke Windows-computer kunt u deze hulpprogramma's proberen:

  • SQL Server Management Studio (ssms.exe), dat verbinding maakt met behulp van ADO.NET
  • sqlcmd.exe, die verbinding maakt met behulp van ODBC

Nadat het programma is verbonden, test u of een korte SQL SELECT-query werkt.

Diagnostische gegevens: de geopende poorten controleren

Als u vermoedt dat verbindingspogingen mislukken vanwege poortproblemen, kunt u een hulpprogramma uitvoeren op uw computer dat rapporteert over de poortconfiguraties.

In Linux zijn de volgende hulpprogramma's mogelijk handig:

  • netstat -nap
  • nmap -sS -O 127.0.0.1: Wijzig de voorbeeldwaarde in uw IP-adres.

In Windows kan het hulpprogramma PortQry.exe nuttig zijn. Hier volgt een voorbeeld van het uitvoeren van een query op de poortsituatie op een database in SQL Database en die is uitgevoerd op een laptopcomputer:

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

Diagnostische gegevens: uw fouten registreren

Een onregelmatig probleem wordt soms het beste opgegeven door detectie van een algemeen patroon gedurende dagen of weken.

Uw client kan helpen bij een diagnose door alle fouten vast te stellen die optreden. Mogelijk kunt u de logboekvermeldingen correleren met foutgegevens die SQL Database intern registreert.

Enterprise Library 6 (EntLib60) biedt beheerde .NET-klassen voor hulp bij logboekregistratie. Zie 5 - Net zo eenvoudig als het vallen van een logboek: Gebruik het toepassingsblok voor logboekregistratie.

Diagnostische gegevens: Systeemlogboeken op fouten onderzoeken

Hier volgen enkele Transact-SQL SELECT-instructies die query's uitvoeren op foutenlogboeken en andere informatie.

Query van logboek Omschrijving
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;
De weergave sys.event_log bevat informatie over afzonderlijke gebeurtenissen, waaronder enkele gebeurtenissen die tijdelijke fouten of connectiviteitsfouten kunnen veroorzaken.

In het ideale voorbeeld kunt u de start_time of end_time waarden correleren met informatie over wanneer uw clientprogramma problemen ondervindt.

U moet verbinding maken met de hoofddatabase om deze query uit te voeren.
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;
De weergave sys.database_connection_stats biedt geaggregeerde aantallen gebeurtenistypen voor aanvullende diagnostische gegevens.

U moet verbinding maken met de hoofddatabase om deze query uit te voeren.

Diagnostische gegevens: zoeken naar probleem gebeurtenissen in het SQL Database-logboek

U kunt zoeken naar vermeldingen over probleem gebeurtenissen in het SQL Database-logboek. Probeer de volgende Transact-SQL SELECT-instructie in de hoofddatabase :

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
;

Een paar geretourneerde rijen uit sys.fn_xe_telemetry_blob_target_read_file

In het volgende voorbeeld ziet u hoe een geretourneerde rij eruit kan zien. De weergegeven null-waarden zijn vaak niet null in andere rijen.

object_name                   timestamp                    error  state  is_success  database_name

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

Ondernemingsbibliotheek 6

Enterprise Library 6 (EntLib60) is een framework van .NET-klassen waarmee u robuuste clients van cloudservices kunt implementeren, een daarvan is SQL Database. Zie Enterprise Library 6 - April 2013 voor informatie over onderwerpen die specifiek zijn voor elk gebied waarin EntLib60 kan helpen.

Logica voor opnieuw proberen voor het afhandelen van tijdelijke fouten is één gebied waarin EntLib60 kan helpen. Zie 4 - Doorzettingsvermogen, geheim van alle triomfen voor meer informatie: Gebruik het toepassingsblok voor tijdelijke foutafhandeling.

Notitie

De broncode voor EntLib60 is beschikbaar voor openbare download vanuit het Downloadcentrum. Microsoft heeft geen plannen om verdere functie-updates of onderhoudsupdates te maken voor EntLib.

EntLib60-klassen voor tijdelijke fouten en opnieuw proberen

De volgende EntLib60-klassen zijn met name handig voor logica voor opnieuw proberen. Al deze klassen vindt u in of onder de naamruimte Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.

In de naamruimte Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling:

  • Klasse RetryPolicy
    • Methode ExecuteAction
  • Klasse ExponentialBackoff
  • Klasse SqlDatabaseTransientErrorDetectionStrategy
  • ReliableSql Verbinding maken ionklasse
    • Methode ExecuteCommand

In de naamruimte Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.TestSupport:

  • Klasse AlwaysTransientErrorDetectionStrategy
  • Klasse NeverTransientErrorDetectionStrategy

Hier volgen enkele koppelingen naar informatie over EntLib60:

EntLib60: Het logboekregistratieblok

  • Het logboekregistratieblok is een zeer flexibele en configureerbare oplossing waarmee u het volgende kunt doen:
    • Logboekberichten maken en opslaan op een groot aantal locaties.
    • Berichten categoriseren en filteren.
    • Verzamel contextuele informatie die nuttig is voor foutopsporing en tracering, evenals voor controle en algemene vereisten voor logboekregistratie.
  • Het logboekregistratieblok abstraheert de logboekfunctionaliteit van de logboekbestemming, zodat de toepassingscode consistent is, ongeacht de locatie en het type van het doellogboekarchief.

Zie 5 - Net zo eenvoudig als het vallen van een logboek: Gebruik het toepassingsblok voor logboekregistratie.

Broncode van methode EntLib60 IsTransient

Vervolgens is vanuit de klasse SqlDatabaseTransientErrorDetectionStrategy de C#-broncode voor de Methode IsTransient . De broncode verduidelijkt welke fouten vanaf april 2013 als tijdelijk en opnieuw kunnen worden geprobeerd.

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

Volgende stappen