閒置連線恢復功能

下載 PHP 驅動程式

連線復原是在特定限制內,能夠重新建立中斷閒置連線的準則。 如果資料庫的連線失敗,連線復原功能可讓用戶端自動嘗試重新連線。 連線復原是資料來源的屬性。 只有 SQL Server 2014 和更新版本和Azure SQL資料庫支援連線復原功能。

連線復原是使用兩個可新增至連接字串的連接關鍵字來實作: ConnectRetryCountConnectRetryInterval

關鍵字 預設 描述
ConnectRetryCount 介於 0 和 255 (含) 之間的整數 1 重新建立已中斷連線的嘗試次數上限,超過即放棄。 根據預設,系統會在連線中斷時嘗試重新建立一次。 的值 0 表示不會嘗試重新連線。
ConnectRetryInterval 介於 1 和 60 (含) 之間的整數 10 重新建立連線嘗試的間隔時間 (以秒為單位)。 應用程式會在偵測到連線中斷時立即嘗試重新連線,然後等候 ConnectRetryInterval 秒後再試一次。 如果 ConnectRetryCount 等於 0,便會忽略此關鍵字。

如果 乘以 的乘 ConnectRetryCountConnectRetryInterval 積大於 LoginTimeout ,則用戶端會停止嘗試連線一次 LoginTimeout ,否則會繼續嘗試重新連線,直到 ConnectRetryCount 到達為止。

備註

連線復原適用於連線閒置的時候。 例如,執行交易時發生的失敗不會觸發重新連線嘗試 -否則會失敗。 下列情況稱為不可復原的會話狀態,不會觸發重新連線嘗試:

  • 暫存資料表
  • 全域和本機資料指標
  • 交易內容與工作階段層級交易鎖定
  • 應用程式鎖定
  • EXECUTE AS/REVERT 資訊安全內容
  • OLE 自動化控制代碼
  • 已備妥的 XML 控制代碼
  • 追蹤旗標

範例

下列程式碼會連線到資料庫並執行查詢。 該連線會藉由終止工作階段來中斷,然後嘗試使用已中斷的連線執行新查詢。 這個範例會使用 AdventureWorks 範例資料庫。

在此範例中,我們會在中斷連線之前,指定緩衝資料指標。 如果未指定緩衝資料指標,則不會重新建立連線,因為會有作用中的伺服器端資料指標。 因此,當中斷時,連線不會閒置。 不過,在此情況下,我們可以先呼叫 sqlsrv_free_stmt() ,再中斷連線以空出資料指標,且連線會成功重新建立。

<?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 = 'AdventureWorks2014';
$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 );
?>

預期輸出:

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

另請參閱

ODBC 驅動程式中的連線復原