Pengumpulan Koneksi (Driver Microsoft untuk PHP untuk SQL Server)

Unduh driver PHP

Poin-poin berikut penting tentang pengumpulan koneksi di Driver Microsoft untuk PHP untuk SQL Server:

  • Driver Microsoft untuk PHP dan SQL Server menggunakan pooling koneksi ODBC.

  • Secara default, pengumpulan koneksi diaktifkan di Windows. Di Linux dan macOS, koneksi dikumpulkan hanya jika pengumpulan koneksi diaktifkan untuk ODBC (lihat Mengaktifkan atau menonaktifkan pengumpulan koneksi). Ketika pengumpulan koneksi diaktifkan dan Anda tersambung ke server, driver mencoba menggunakan koneksi terkumpul sebelum membuat yang baru. Jika koneksi yang setara tidak ditemukan di kumpulan, koneksi baru dibuat dan ditambahkan ke kumpulan. Driver menentukan apakah koneksi setara berdasarkan perbandingan string koneksi.

  • Ketika koneksi dari kumpulan digunakan, status koneksi diatur ulang (hanya Windows).

  • Menutup koneksi mengembalikan koneksi ke kumpulan.

Untuk informasi selengkapnya tentang pengumpulan koneksi, lihat Pengumpulan Koneksi Manajer Driver.

Mengaktifkan/Menonaktifkan pengumpulan koneksi

Windows

Anda dapat memaksa driver untuk membuat koneksi baru (alih-alih mencari koneksi yang setara di kumpulan koneksi) dengan mengatur nilai atribut ConnectionPooling di string koneksi ke false (atau 0).

Jika atribut ConnectionPooling dihilangkan dari string koneksi atau jika diatur ke true (atau 1), driver hanya membuat koneksi baru jika koneksi yang setara tidak ada di kumpulan koneksi.

Catatan

Beberapa Set Hasil Aktif (MARS) diaktifkan secara default. Ketika MARS dan pengumpulan sedang digunakan, agar MARS berfungsi dengan benar, driver memerlukan waktu yang lebih lama untuk mengatur ulang koneksi pada kueri pertama , sehingga mengabaikan batas waktu kueri yang ditentukan. Namun, pengaturan batas waktu kueri berlaku dalam kueri berikutnya.

Jika perlu, lihat Cara: Menonaktifkan Beberapa Resultset Aktif (MARS). Untuk informasi tentang atribut koneksi lainnya, lihat Opsi Koneksi.

Linux dan macOS

Atribut ConnectionPooling tidak dapat digunakan untuk mengaktifkan atau menonaktifkan pengumpulan koneksi.

Pengumpulan koneksi dapat diaktifkan atau dinonaktifkan dengan mengedit file konfigurasi odbcinst.ini. Driver harus dimuat ulang agar perubahan dapat berlaku.

Mengatur Pooling ke Yes dan nilai positif CPTimeout dalam file odbcinst.ini memungkinkan pengumpulan koneksi.

[ODBC]
Pooling=Yes

[ODBC Driver 17 for SQL Server]
CPTimeout=<int value>

Minimal, file odbcinst.ini akan terlihat seperti contoh berikut:

[ODBC]
Pooling=Yes

[ODBC Driver 17 for SQL Server]
Description=Microsoft ODBC Driver 17 for SQL Server
Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.5.so.2.1
UsageCount=1
CPTimeout=120

Pengaturan Pooling ke No dalam file odbcinst.ini memaksa driver untuk membuat koneksi baru.

[ODBC]
Pooling=No

Keterangan

  • Di Linux atau macOS, pengumpulan koneksi tidak disarankan dengan unixODBC < 2.3.7. Semua koneksi akan dikumpulkan jika pengumpulan diaktifkan dalam file odbcinst.ini, yang berarti opsi koneksi ConnectionPooling tidak berpengaruh. Untuk menonaktifkan pengumpulan, atur Pooling=Tidak di file odbcinst.ini dan muat ulang driver.

    • unixODBC <= 2.3.4 (Linux dan macOS) mungkin tidak mengembalikan informasi diagnostik yang tepat, seperti pesan kesalahan, peringatan, dan pesan informatif.
    • Untuk alasan ini, driver SQLSRV dan PDO_SQLSRV mungkin tidak dapat mengambil data panjang dengan benar (seperti xml, biner) sebagai string. Data panjang dapat diambil sebagai aliran sebagai solusi alternatif. Lihat contoh berikut untuk SQLSRV.
  • Saat menggunakan AccessToken dengan penggunaan pooling koneksi, driver menambahkan hash konten token ke kata kunci konektivitas APP agar koneksi dengan token akses yang berbeda tidak dikumpulkan bersama-sama. Ini mencegah kontaminasi silang identitas, di mana sebuah koneksi yang dikumpulkan dan diautentikasi sebagai satu identitas dapat digunakan kembali untuk identitas yang berbeda. Data token di-cache dengan kedaluwarsa berbasis TTL untuk memastikan stabilitas pointer untuk driver ODBC. Perilaku ini diperkenalkan dalam versi 5.13.1.

<?php
$connectionInfo = array("Database"=>"test", "UID"=>"username", "PWD"=>"password");

$conn1 = sqlsrv_connect("servername", $connectionInfo);

$longSample = str_repeat("a", 8500);
$xml1 = 
'<ParentXMLTag>
  <ChildTag01>'.$longSample.'</ChildTag01>
</ParentXMLTag>';

// Create table and insert xml string into it
sqlsrv_query($conn1, "CREATE TABLE xml_table (field xml)");
sqlsrv_query($conn1, "INSERT into xml_table values ('$xml1')");

// retrieve the inserted xml
$column1 = getColumn($conn1);

// return the connection to the pool
sqlsrv_close($conn1);

// This connection is from the pool
$conn2 = sqlsrv_connect("servername", $connectionInfo);
$column2 = getColumn($conn2);

sqlsrv_query($conn2, "DROP TABLE xml_table");
sqlsrv_close($conn2);

function getColumn($conn)
{
    $tsql = "SELECT * from xml_table";
    $stmt = sqlsrv_query($conn, $tsql);
    sqlsrv_fetch($stmt);
    // This might fail in Linux and macOS
    // $column = sqlsrv_get_field($stmt, 0, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR));
    // The workaround is to fetch it as a stream
    $column = sqlsrv_get_field($stmt, 0, SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_CHAR));
    sqlsrv_free_stmt($stmt);
    return ($column);
}
?>