Sdílet prostřednictvím


Odolnost nečinných připojení

Stáhnout ovladač PHP

Odolnost připojení je princip, že v určitých omezeních je možné obnovit nefunkční nečinné připojení. Pokud připojení k databázi selže, odolnost připojení umožňuje klientovi automaticky se znovu připojit. Odolnost připojení je vlastností zdroje dat. Odolnost připojení podporuje pouze SQL Server 2014 a novější a Azure SQL Database.

Odolnost připojení je implementována se dvěma klíčovými slovy připojení, která lze přidat do připojovacích řetězců: ConnectRetryCount a ConnectRetryInterval.

Keyword Hodnoty Výchozí Description
ConnectRetryCount Celé číslo mezi 0 a 255 (včetně) 1 Maximální počet pokusů o obnovení přerušeného připojení před vzdáním se. Ve výchozím nastavení se při přerušení připojení provede jeden pokus o obnovení připojení. Hodnota 0 znamená, že se nebude pokoušet o opětovné připojení.
ConnectRetryInterval Celé číslo mezi 1 a 60 (včetně) 10 Čas v sekundách mezi pokusy o obnovení připojení. Aplikace se pokusí znovu připojit okamžitě po zjištění poškozeného připojení a pak počká ConnectRetryInterval několik sekund, než se pokusí znovu. Toto klíčové slovo se ignoruje, pokud ConnectRetryCount je rovno 0.

Pokud je součin ConnectRetryCount vynásobený ConnectRetryInterval větší než LoginTimeout, klient se přestane pokoušet o připojení po dosažení LoginTimeout; jinak se bude nadále pokoušet o znovupřipojení, dokud nebude dosaženo ConnectRetryCount.

Poznámky

Odolnost připojení platí, když je připojení nečinné. Selhání, ke kterým dochází při provádění transakce, například neaktivují pokusy o opětovné připojení – selžou, jak by jinak bylo očekáváno. Následující situace, označované jako neobnovitelné stavy relací, neaktivují pokusy o opětovné připojení:

  • Dočasné tabulky
  • Globální a místní kurzory
  • Kontext transakce a zámky transakcí na úrovni sessionu
  • Zámky aplikací
  • SPUŠTĚNÍ KONTEXTU ZABEZPEČENÍ AS/REVERT
  • Úchyty pro automatizaci OLE
  • Připravené popisovače XML
  • Trasovací příznaky

Example

Následující kód se připojí k databázi a spustí dotaz. Připojení je přerušeno ukončením relace a nový dotaz se pokusí použít přerušené připojení. Tento příklad používá ukázkovou databázi AdventureWorks .

V tomto příkladu před přerušením připojení určíme vyrovnávaný kurzor. Pokud nezadáme kurzor ve vyrovnávací paměti, připojení by se znovu nenastavilo, protože by se zobrazil aktivní kurzor na straně serveru. V takovém případě by připojení při přerušení nebylo nečinné. V takovém případě bychom však mohli zavolat sqlsrv_free_stmt() před přerušením připojení k uvolnění kurzoru a připojení by bylo úspěšně obnoveno.

<?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 );
?>

Očekávaný výstup:

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

Viz také

Odolnost připojení v ovladači ODBC