Share via


Tolerantie voor niet-actieve verbindingen

PHP-stuurprogramma downloaden

Verbindingstolerantie is het principe dat een verbroken niet-actieve verbinding binnen bepaalde beperkingen kan worden hersteld. Als een verbinding met de database mislukt, stelt verbindingsresistentie de client in staat om automatisch te proberen opnieuw verbinding te maken. Verbindingstolerantie is een eigenschap van de gegevensbron. Alleen SQL Server 2014 en hoger en Azure SQL Database bieden ondersteuning voor verbindingstolerantie.

Verbindingstolerantie wordt geïmplementeerd met twee verbindingstrefwoorden die kunnen worden toegevoegd aan verbindingsreeksen: ConnectRetryCount en ConnectRetryInterval.

Keyword Waarden Verstek Description
ConnectRetryCount Geheel getal tussen 0 en 255 (inclusief) 1 Het maximum aantal pogingen om een verbroken verbinding te herstellen voordat u het opgeeft. Standaard wordt één poging gedaan om een verbinding opnieuw tot stand te gebracht wanneer deze wordt verbroken. Een waarde van 0 betekent dat er geen nieuwe verbinding wordt geprobeerd.
ConnectRetryInterval Geheel getal tussen 1 en 60 (inclusief) 10 De tijd, in seconden, tussen pogingen om een verbinding te herstellen. De toepassing probeert onmiddellijk opnieuw verbinding te maken bij het detecteren van een verbroken verbinding en wacht ConnectRetryInterval vervolgens seconden voordat u het opnieuw probeert. Dit trefwoord wordt genegeerd als ConnectRetryCount het gelijk is aan 0.

Als het product van ConnectRetryCount vermenigvuldigd met ConnectRetryInterval groter is dan LoginTimeout, stopt de client met proberen verbinding te maken zodra LoginTimeout is bereikt; anders blijft de client proberen opnieuw verbinding te maken totdat ConnectRetryCount is bereikt.

Opmerkingen

Verbindingstolerantie is van toepassing wanneer de verbinding niet actief is. Fouten die optreden tijdens het uitvoeren van een transactie, activeren bijvoorbeeld geen pogingen om opnieuw verbinding te maken. Ze mislukken zoals anders zou worden verwacht. De volgende situaties, ook wel niet herstelbare sessiestatussen genoemd, activeren geen pogingen om opnieuw verbinding te maken:

  • Tijdelijke tabellen
  • Globale en lokale cursors
  • Transactiecontext en transactievergrendelingen op sessieniveau
  • Applicatievergrendelingen
  • UITVOEREN ALS/HERSTELLEN van veiligheidscontext
  • OLE-automatiseringsgrepen
  • Voorbereide XML-ingangen
  • Traceringsvlaggen

Example

De volgende code maakt verbinding met een database en voert een query uit. De verbinding wordt onderbroken door de sessie te beëindigen en er wordt geprobeerd een nieuwe query te maken met behulp van de verbroken verbinding. In dit voorbeeld wordt de AdventureWorks-voorbeelddatabase gebruikt.

In dit voorbeeld geven we een gebufferde cursor op voordat de verbinding wordt onderbroken. Als we geen buffercursor opgeven, wordt de verbinding niet hersteld omdat er een actieve cursor aan de serverzijde zou zijn. Als zodanig zou de verbinding niet inactief zijn wanneer deze wordt verbroken. Echter, in dat geval zouden we sqlsrv_free_stmt() kunnen aanroepen voordat de verbinding wordt verbroken om de cursor te verwijderen, en zou de verbinding succesvol opnieuw tot stand worden gebracht.

<?php
// This function breaks the connection by determining its session ID and killing it.
// A separate connection is used to break the main connection because a session
// cannot kill itself. The sleep() function ensures enough time has passed for KILL
// to finish ending the session.
function BreakConnection( $conn, $conn_break )
{
    $stmt1 = sqlsrv_query( $conn, "SELECT @@SPID" );
    if ( sqlsrv_fetch( $stmt1 ) )
    {
        $spid=sqlsrv_get_field( $stmt1, 0 );
    }

    $stmt2 = sqlsrv_prepare( $conn_break, "KILL ".$spid );
    sqlsrv_execute( $stmt2 );
    sleep(1);
}

// Connect to the local server using Windows authentication and specify
// AdventureWorks as the database in use. Specify values for
// ConnectRetryCount and ConnectRetryInterval as well.
$databaseName = 'AdventureWorks2022';
$serverName = '(local)';
$connectionInfo = array( "Database"=>$databaseName, "ConnectRetryCount"=>10, "ConnectRetryInterval"=>10 );

$conn = sqlsrv_connect( $serverName, $connectionInfo );
if( $conn === false)  
{  
     echo "Could not connect.\n";  
     die( print_r( sqlsrv_errors(), true));  
}

// A separate connection that will be used to break the main connection $conn
$conn_break = sqlsrv_connect( $serverName, array( "Database"=>$databaseName) );

// Create a statement to retrieve the contents of a table
$stmt1 = sqlsrv_query( $conn, "SELECT * FROM HumanResources.Employee",
                       array(), array( "Scrollable"=>"buffered" ) );
if( $stmt1 === false )
{
     echo "Error in statement 1.\n";
     die( print_r( sqlsrv_errors(), true ));
}
else
{
    echo "Statement 1 successful.\n";
    $rowcount = sqlsrv_num_rows( $stmt1 );
    echo $rowcount." rows in result set.\n";
}

// Now break the connection $conn
BreakConnection( $conn, $conn_break );

// Create another statement. The connection will be reestablished.
$stmt2 = sqlsrv_query( $conn, "SELECT * FROM HumanResources.Department",
                       array(), array( "Scrollable"=>"buffered" ) );
if( $stmt2 === false )
{
     echo "Error in statement 2.\n";
     die( print_r( sqlsrv_errors(), true ));
}
else
{
    echo "Statement 2 successful.\n";
    $rowcount = sqlsrv_num_rows( $stmt2 );
    echo $rowcount." rows in result set.\n";
}

sqlsrv_close( $conn );
sqlsrv_close( $conn_break );
?>

Verwachte uitvoer:

Statement 1 successful.
290 rows in result set.
Statement 2 successful.
16 rows in result set.

Zie ook

Verbindingstolerantie in het ODBC-stuurprogramma