Pengumpulan Koneksi (Driver Microsoft untuk PHP untuk SQL Server)
Berikut ini adalah poin penting yang perlu diperhatikan tentang pengumpulan koneksi di Microsoft Drivers untuk PHP untuk SQL Server:
Driver Microsoft untuk PHP untuk SQL Server menggunakan pengumpulan koneksi ODBC.
Secara default, pengumpulan koneksi diaktifkan di Windows. Di Linux dan macOS, koneksi dikumpulkan hanya jika pengumpulan koneksi diaktifkan untuk ODBC (lihat Mengaktifkan/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 akan berlaku dalam kueri berikutnya.
Jika perlu, silakan periksa Cara: Menonaktifkan Beberapa Hasil Aktif (MARS). Untuk informasi tentang atribut koneksi lainnya, lihat Opsi Koneksi.
Linux dan macOS
Atribut ConnectionPooling tidak dapat digunakan untuk mengaktifkan/menonaktifkan pengumpulan koneksi.
Pengumpulan koneksi dapat diaktifkan/dinonaktifkan dengan mengedit file konfigurasi odbcinst.ini. Driver harus dimuat ulang agar perubahan diterapkan.
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 ini:
[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
- karena 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 solusinya. Lihat contoh di bawah ini untuk SQLSRV.
<?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);
}
?>