Ketahanan Koneksi Menganggur
Ketahanan koneksi adalah prinsip bahwa koneksi diam yang rusak dapat dipublikasikan kembali, dalam batasan tertentu. Jika koneksi ke database gagal, ketahanan koneksi memungkinkan klien untuk secara otomatis mencoba menyambungkan kembali. Ketahanan koneksi adalah properti sumber data. Hanya SQL Server 2014 dan yang lebih baru dan Azure SQL Database yang mendukung ketahanan koneksi.
Ketahanan koneksi diimplementasikan dengan dua kata kunci koneksi yang dapat ditambahkan ke string koneksi: ConnectRetryCount
dan ConnectRetryInterval
.
Kata kunci | Nilai | Default | Deskripsi |
---|---|---|---|
ConnectRetryCount |
Bilangan bulat antara 0 dan 255 (inklusif) | 1 | Jumlah maksimum upaya untuk membangun kembali koneksi yang rusak sebelum menyerah. Secara default, satu upaya dilakukan untuk membangun kembali koneksi saat rusak. Nilai 0 berarti bahwa tidak ada koneksi ulang yang akan dicoba. |
ConnectRetryInterval |
Bilangan bulat antara 1 dan 60 (inklusif) | 10 | Waktu, dalam detik, antara upaya untuk membangun kembali koneksi. Aplikasi akan mencoba untuk terhubung kembali segera setelah mendeteksi koneksi yang rusak, dan kemudian akan menunggu ConnectRetryInterval detik sebelum mencoba lagi. Kata kunci ini diabaikan jika ConnectRetryCount sama dengan 0. |
Jika produk yang ConnectRetryCount
dikalikan dengan ConnectRetryInterval
lebih besar dari LoginTimeout
, maka klien akan berhenti mencoba untuk terhubung setelah LoginTimeout
tercapai; jika tidak, itu akan terus mencoba untuk terhubung kembali sampai ConnectRetryCount
tercapai.
Keterangan
Ketahanan koneksi berlaku saat koneksi diam. Kegagalan yang terjadi saat menjalankan transaksi, misalnya, tidak akan memicu upaya koneksi ulang - mereka akan gagal seperti yang diharapkan. Situasi berikut, yang dikenal sebagai status sesi yang tidak dapat dipulihkan, tidak akan memicu upaya koneksi ulang:
- Tabel sementara
- Kursor global dan lokal
- Konteks transaksi dan kunci transaksi tingkat sesi
- Kunci aplikasi
- KONTEKS KEAMANAN EXECUTE AS/REVERT
- Handel otomatisasi OLE
- Handel XML yang disiapkan
- Bendera pelacakan
Contoh
Kode berikut tersambung ke database dan menjalankan kueri. Koneksi terganggu dengan mematikan sesi dan kueri baru dicoba menggunakan koneksi yang rusak. Contoh ini menggunakan database sampel AdventureWorks .
Dalam contoh ini, kami menentukan kursor yang di-buffer sebelum memutuskan koneksi. Jika kami tidak menentukan kursor yang di-buffer, koneksi tidak akan dibuat ulang karena akan ada kursor sisi server aktif. Dengan demikian, koneksi tidak akan menganggur saat rusak. Namun, dalam hal ini kita dapat memanggil sqlsrv_free_stmt()
sebelum memutuskan koneksi untuk mengosungsi kursor, dan koneksi akan berhasil dibangun kembali.
<?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 );
?>
Output yang diharapkan:
Statement 1 successful.
290 rows in result set.
Statement 2 successful.
16 rows in result set.