Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A resiliência da ligação é o princípio de que uma ligação ociosa quebrada pode ser restabelecida, dentro de certas restrições. Se uma ligação à base de dados falhar, a resiliência da ligação permite que o cliente tente reconectar-se automaticamente. A resiliência da ligação é uma propriedade da fonte de dados. Apenas o SQL Server 2014 e posteriores e a Azure SQL Database suportam resiliência de ligação.
A resiliência da ligação é implementada com duas palavras-chave de ligação que podem ser adicionadas às strings de ligação: ConnectRetryCount e ConnectRetryInterval.
| Keyword | Valores | Predefinido | Description |
|---|---|---|---|
ConnectRetryCount |
Inteiro entre 0 e 255 (inclusive) | 1 | O número máximo de tentativas para restabelecer uma ligação quebrada antes de desistir. Por padrão, uma única tentativa é feita para restabelecer uma ligação quando quebrada. Um valor de 0 significa que não será tentada uma reconexão. |
ConnectRetryInterval |
Inteiro entre 1 e 60 (inclusive) | 10 | O tempo, em segundos, entre tentativas de restabelecer uma ligação. A aplicação tenta reconectar-se imediatamente assim que detetar uma ligação quebrada e espera ConnectRetryInterval segundos antes de tentar novamente. Esta palavra-chave é ignorada se ConnectRetryCount for igual a 0. |
Se o produto de ConnectRetryCount multiplicado por ConnectRetryInterval for maior que LoginTimeout, então o cliente deixará de tentar conectar assim que LoginTimeout for atingido; caso contrário, continuará a tentar reconectar até ConnectRetryCount ser atingido.
Observações
A resiliência da ligação aplica-se quando a ligação está ociosa. Falhas que ocorrem durante a execução de uma transação, por exemplo, não desencadeiam tentativas de reconexão – falharão como seria esperado. As seguintes situações, conhecidas como estados de sessão não recuperáveis, não desencadearão tentativas de reconexão:
- Tabelas temporárias
- Cursores globais e locais
- Contexto de transação e bloqueios de transação ao nível da sessão
- Bloqueios de aplicação
- EXECUTAR COMO/REVERTER contexto de segurança
- Tratos de automação OLE
- Barras XML preparadas
- Sinalizadores de rastreio
Example
O código seguinte liga-se a uma base de dados e executa uma consulta. A ligação é interrompida ao interromper a sessão e uma nova consulta é tentada usando a ligação avariada. Este exemplo utiliza a base de dados de exemplo AdventureWorks.
Neste exemplo, especificamos um cursor com buffer antes de interromper a ligação. Se não especificarmos um cursor com buffer, a ligação não seria restabelecida porque haveria um cursor ativo do lado do servidor. Assim, a ligação não ficaria inativa quando quebrada. No entanto, nesse caso, poderíamos chamar sqlsrv_free_stmt() antes de cortar a conexão para libertar o cursor, e a conexão seria restabelecida com sucesso.
<?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 );
?>
Resultados esperados:
Statement 1 successful.
290 rows in result set.
Statement 2 successful.
16 rows in result set.