Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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.