Megosztás:


Szünetmentes kapcsolati rugalmasság

PHP-illesztőprogram letöltése

A kapcsolat rugalmassága az az alapelv, hogy a megszakadt üresjárati kapcsolatok bizonyos korlátozásokon belül újra létrehozhatóak. Ha az adatbázishoz való csatlakozás meghiúsul, a kapcsolat rugalmassága lehetővé teszi, hogy az ügyfél automatikusan megpróbáljon újracsatlakozni. A kapcsolat rugalmassága az adatforrás egyik tulajdonsága. Csak az SQL Server 2014 és újabb verziók és az Azure SQL Database támogatja a kapcsolat rugalmasságát.

A kapcsolat rugalmassága két kapcsolati kulcsszóval van implementálva, amelyek hozzáadhatók a kapcsolati sztringekhez: ConnectRetryCount és ConnectRetryInterval.

Keyword Értékek Alapértelmezett Description
ConnectRetryCount Egész szám 0 és 255 között (beleértve) 1 A megszakadt kapcsolat újbóli létesítésére tett kísérletek maximális száma a feladás előtt. Alapértelmezés szerint a rendszer egyetlen kísérletet tesz egy kapcsolat újbóli létesítésére, ha megszakadt. Az érték 0 azt jelenti, hogy a rendszer nem kísérel meg újracsatlakozást.
ConnectRetryInterval Egész szám 1 és 60 között (beleértve) 10 A kapcsolat újbóli létesítésére tett kísérletek közötti idő másodpercben. Az alkalmazás a megszakadt kapcsolat észlelésekor azonnal megkísérli az újracsatlakozást, majd másodperceket vár ConnectRetryInterval , mielőtt újra próbálkozna. Ez a kulcsszó figyelmen kívül lesz hagyva, ha ConnectRetryCount 0-nak felel meg.

Ha a ConnectRetryCount és a ConnectRetryInterval szorzata nagyobb, mint LoginTimeout, akkor az ügyfél abbahagyja a csatlakozási próbálkozást, amikor eléri LoginTimeout; különben tovább próbálkozik, amíg ConnectRetryCount elérésre nem kerül.

Megjegyzések

A kapcsolat rugalmassága akkor érvényes, ha a kapcsolat tétlen. A tranzakciók végrehajtása során előforduló hibák például nem aktiválják az újracsatlakozási kísérleteket – az egyébként várt módon meghiúsulnak. A következő, nem helyreállítható munkamenet-állapotok nem indítják el az újracsatlakozási kísérleteket:

  • ideiglenes táblák
  • Globális és helyi kurzorok
  • Tranzakciókörnyezet és munkamenetszintű tranzakciózárolások
  • Alkalmazászárolások
  • Az AS/REVERT biztonsági környezet végrehajtása
  • OLE automatizálási fogópontok
  • Előkészített XML-kezelők
  • Nyomkövetési jelzők

Example

Az alábbi kód egy adatbázishoz csatlakozik, és végrehajt egy lekérdezést. A kapcsolat megszakad a munkamenet megszakításával, és egy új lekérdezést kísérel meg a megszakadt kapcsolat használatával. Ez a példa az AdventureWorks mintaadatbázist használja.

Ebben a példában egy pufferelt kurzort adunk meg a kapcsolat megszakadása előtt. Ha nem adunk meg pufferelt kurzort, a kapcsolat nem jönne létre újra, mert lenne egy aktív szerveroldali kurzor. Így a kapcsolat nem lenne inaktív, ha megszakadna. Azonban ebben az esetben meghívhatjuk a sqlsrv_free_stmt()-t, mielőtt megszakítanánk a kapcsolatot, hogy kiürítsük a kurzort, és így a kapcsolat sikeresen újra létrejön.

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

Várt kimenet:

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

Lásd még

Kapcsolat rugalmassága az ODBC-illesztőben