Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.