Boşta Bağlantı Dayanıklılığı

PHP sürücüsünü indirme

Bağlantı dayanıklılığı , belirli kısıtlamalar dahilinde bozuk boşta kalan bir bağlantının yeniden kurulabileceği ilkesidir. Veritabanına bağlantı başarısız olursa, bağlantı dayanıklılığı istemcinin otomatik olarak yeniden bağlanmayı denemesine olanak tanır. Bağlantı dayanıklılığı, veri kaynağının bir özelliğidir. Yalnızca SQL Server 2014 ve üzeri ile Azure SQL Veritabanı bağlantı dayanıklılığını destekler.

Bağlantı dayanıklılığı, bağlantı dizelerine eklenebilen iki bağlantı anahtar sözcüğüyle uygulanır: ConnectRetryCount ve ConnectRetryInterval.

Keyword Değerler Varsayılan Description
ConnectRetryCount 0 ile 255 arasında tamsayı (dahil) 1 Vazgeçmeden önce bozuk bir bağlantıyı yeniden kurmaya yönelik en fazla deneme sayısı. Varsayılan olarak, bağlantı kesildiğinde yeniden kurmak için tek bir deneme yapılır. değeri 0 , yeniden bağlanma girişiminde bulunılmayacak anlamına gelir.
ConnectRetryInterval 1 ile 60 arasında tamsayı (dahil) 10 Bağlantıyı yeniden kurmaya yönelik girişimler arasındaki saniye cinsinden süre. Uygulama, kopuk bir bağlantı algılanması üzerine hemen yeniden bağlanmayı dener ve yeniden denemeden önce saniyeler bekler ConnectRetryInterval . Bu anahtar sözcük, ConnectRetryCount 0'a eşitse yoksayılır.

Eğer ConnectRetryCount ile ConnectRetryInterval çarpımının sonucu LoginTimeout'den büyükse, istemci LoginTimeout ulaşana kadar bağlanma girişimlerini durdurur; aksi takdirde ConnectRetryCount ulaşılana kadar yeniden bağlanmayı dener.

Açıklamalar

Bağlantı boşta olduğunda bağlantı dayanıklılığı uygulanır. Örneğin bir işlem yürütülürken oluşan hatalar yeniden bağlanma girişimlerini tetiklemez; aksi takdirde beklendiği gibi başarısız olur. Kurtarılamayan oturum durumları olarak bilinen aşağıdaki durumlar yeniden bağlanma girişimlerini tetiklemez:

  • Geçici tablolar
  • Genel ve yerel imleçler
  • İşlem bağlamı ve oturum düzeyi işlem kilitleri
  • Uygulama kilitleri
  • EXECUTE AS/REVERT güvenlik bağlamı
  • OLE otomasyon işaretçileri
  • Hazırlanan XML işleyicileri
  • İzleme bayrakları

Example

Aşağıdaki kod bir veritabanına bağlanır ve bir sorgu yürütür. Oturum sonlandırılarak bağlantı kesilir ve bozuk bağlantı kullanılarak yeni bir sorgu denendi. Bu örnekte AdventureWorks örnek veritabanı kullanılmaktadır.

Bağlantıyı kesmeden önce, arabelleğe alınmış bir imleç belirlediğimiz bu örnekte. Arabelleğe alınmış bir imleç belirtmezsek, etkin bir sunucu tarafı imleç mevcut olacağı için bağlantı yeniden kurulamaz. Bu nedenle bağlantı kesildiğinde boşta kalmaz. Ancak bu durumda, imleci boşaltmak için bağlantıyı kesmeden önce çağırabiliriz sqlsrv_free_stmt() ve bağlantı başarıyla yeniden kurulabilir.

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

Beklenen çıkış:

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

Ayrıca bakınız

ODBC sürücüsünde bağlantı dayanıklılığı