Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Odporność połączenia jest zasadą, że nieaktywne lub zerwane połączenie można ponownie nawiązać w ramach określonych ograniczeń. Jeśli połączenie z bazą danych zakończy się niepowodzeniem, odporność połączenia umożliwia klientowi automatyczne próby ponownego nawiązania połączenia. Odporność połączenia to właściwość źródła danych. Odporność połączeń obsługuje tylko program SQL Server 2014 lub nowszy oraz usługę Azure SQL Database.
Odporność połączenia jest implementowana przy użyciu dwóch słów kluczowych połączenia, które można dodać do parametrów połączenia: ConnectRetryCount i ConnectRetryInterval.
| Keyword | Wartości | Default | Description |
|---|---|---|---|
ConnectRetryCount |
Liczba całkowita z zakresu od 0 do 255 (włącznie) | 1 | Maksymalna liczba prób ponownego nawiązania przerwanego połączenia przed rezygnacją. Domyślnie jest podejmowana pojedyncza próba ponownego utworzenia połączenia po przerwaniu połączenia. Wartość 0 oznacza, że nie zostanie podjęta próba ponownego nawiązania połączenia. |
ConnectRetryInterval |
Liczba całkowita z zakresu od 1 do 60 (włącznie) | 10 | Czas ( w sekundach) między próbami ponownego utworzenia połączenia. Aplikacja podejmie próbę ponownego nawiązania połączenia natychmiast po wykryciu przerwanego połączenia, a następnie zaczeka ConnectRetryInterval kilka sekund przed ponowną próbą. To słowo kluczowe jest ignorowane, jeśli ConnectRetryCount jest równe 0. |
Jeśli iloczyn ConnectRetryCount pomnożony przez ConnectRetryInterval jest większy niż LoginTimeout, klient przestanie próbować nawiązać połączenie, gdy osiągnie LoginTimeout; w przeciwnym razie będzie kontynuować próby ponownego nawiązania połączenia, dopóki nie zostanie osiągnięty ConnectRetryCount.
Uwagi
Odporność połączenia ma zastosowanie, gdy połączenie jest bezczynne. Błędy występujące podczas wykonywania transakcji, na przykład, nie będą wyzwalać ponownych prób nawiązania połączenia — w przeciwnym razie nie powiedzie się. Następujące sytuacje, znane jako stany sesji niemożliwych do odzyskania, nie będą wyzwalać ponownych prób nawiązania połączenia:
- Tabele tymczasowe
- Kursory globalne i lokalne
- Blokady transakcji na poziomie sesji i kontekstu transakcji
- Blokady aplikacji
- WYKONAJ JAKO/PRZYWRÓĆ kontekst zabezpieczeń
- Uchwyty automatyzacji OLE
- Przygotowane uchwyty XML
- Flagi śledzenia
Example
Poniższy kod łączy się z bazą danych i wykonuje zapytanie. Połączenie jest przerywane przez zakończenie sesji, a nowe zapytanie zostaje podjęte przy użyciu przerwanego połączenia. W tym przykładzie użyto przykładowej bazy danych AdventureWorks .
W tym przykładzie określamy buforowany kursor przed przerwaniem połączenia. Jeśli nie określimy buforowanego kursora, połączenie nie zostanie ponownie nawiązane, ponieważ będzie istnieć aktywny kursor po stronie serwera. W związku z tym połączenie nie będzie bezczynne, gdy połączenie zostanie przerwane. Jednak w takim przypadku można wywołać wywołanie sqlsrv_free_stmt() przed przerwaniem połączenia w celu opuszczenia kursora, a połączenie zostanie pomyślnie ponownie nawiązane.
<?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 );
?>
Oczekiwane dane wyjściowe:
Statement 1 successful.
290 rows in result set.
Statement 2 successful.
16 rows in result set.