Aracılığıyla paylaş


Bağlantı Havuzu (SQL Server için PHP için Microsoft Sürücüleri)

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

SQL Server için PHP için Microsoft Sürücüleri'nde bağlantı havuzu oluşturma hakkında dikkat edilmesi gereken önemli noktalar şunlardır:

  • SQL Server için PHP için Microsoft Sürücüleri ODBC bağlantı havuzu kullanır.

  • Varsayılan olarak, bağlantı havuzu Windows'ta etkindir. Linux ve macOS'ta bağlantılar yalnızca ODBC için bağlantı havuzu etkinleştirilmişse havuza alınır (bkz. Bağlantı havuzunu etkinleştirme/devre dışı bırakma). Bağlantı havuzu etkinleştirildiğinde ve bir sunucuya bağlandığınızda, sürücü yeni bir bağlantı oluşturmadan önce havuza alınan bir bağlantı kullanmayı dener. Havuzda eşdeğer bir bağlantı bulunmazsa, yeni bir bağlantı oluşturulur ve havuza eklenir. Sürücü, bağlantı dizelerinin karşılaştırması temelinde bağlantıların eşdeğer olup olmadığını belirler.

  • Havuzdan bir bağlantı kullanıldığında, bağlantı durumu sıfırlanır (yalnızca Windows).

  • Bağlantı kapatılınca bağlantı havuza geri döndürülür.

Bağlantı havuzu hakkında daha fazla bilgi için Driver Manager Bağlantı Havuzu'na bakın.

Bağlantı havuzunu etkinleştirme/devre dışı bırakma

Windows

Bağlantı dizesindeki ConnectionPooling özniteliğinin değerini false (veya 0) olarak ayarlayarak sürücüyü yeni bir bağlantı oluşturmaya zorlayabilirsiniz (bağlantı havuzunda eşdeğer bir bağlantı aramak yerine).

ConnectionPooling özniteliği bağlantı dizesinden atlanırsa veya true (veya 1) olarak ayarlandıysa, sürücü yalnızca bağlantı havuzunda eşdeğer bir bağlantı yoksa yeni bir bağlantı oluşturur.

Uyarı

Birden çok Etkin Sonuç Kümesi (MARS) varsayılan olarak etkindir. Hem MARS hem de havuz kullanımda olduğunda, MARS'ın düzgün çalışabilmesi için, sürücü ilk sorgudaki bağlantının sıfırlanması için daha uzun bir süreye ihtiyaç duyar, bu nedenle belirtilen sorgu zaman aşımı süresi dikkate alınmaz. Ancak, sorgu zaman aşımı ayarı sonraki sorgularda geçerli olur.

Gerekirse, lütfen Nasıl yapılır: Birden Çok Etkin Sonuç Kümesini (MARS) Devre Dışı Bırakma'yı denetleyin. Diğer bağlantı öznitelikleri hakkında bilgi için bkz. Bağlantı Seçenekleri.

Linux ve macOS

ConnectionPooling özniteliği, bağlantı havuzunu etkinleştirmek/devre dışı bırakmak için kullanılamaz.

Bağlantı havuzu, odbcinst.ini yapılandırma dosyası düzenlenerek etkinleştirilebilir/devre dışı bırakılabilir. Değişikliklerin geçerli olması için sürücü yeniden yüklenmelidir.

odbcinst.ini dosyasında Pooling ve pozitif bir CPTimeout değerini Yes olarak ayarlamak, bağlantı havuzlamayı etkinleştirir.

[ODBC]
Pooling=Yes

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

En düşük düzeyde, odbcinst.ini dosyası şu örneğe benzer görünmelidir:

[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

odbcinst.ini dosyasında Pooling ayarını No olarak ayarlamak, sürücüyü yeni bir bağlantı oluşturmaya zorlar.

[ODBC]
Pooling=No

Açıklamalar

  • Linux veya macOS'ta unixODBC < 2.3.7 ile bağlantı havuzu kullanılması önerilmez. odbcinst.ini dosyasında havuz oluşturma etkinse tüm bağlantılar havuza alınacaktır. Bu, ConnectionPooling bağlantı seçeneğinin hiçbir etkisi olmadığı anlamına gelir. Havuza alma özelliğini devre dışı bırakmak için odbcinst.ini dosyasında Pooling=Hayır'ı ayarlayın ve sürücüleri yeniden yükleyin.
    • unixODBC <= 2.3.4 (Linux ve macOS) hata iletileri, uyarılar ve bilgilendirici iletiler gibi doğru tanılama bilgilerini döndüremeyebilir
    • bu nedenle SQLSRV ve PDO_SQLSRV sürücüleri uzun verileri (xml, ikili gibi) dize olarak düzgün getiremeyebilir. Büyük boyutlu veriler geçici bir çözüm olarak akışlar halinde getirilebilir. AŞAĞıDAKI SQLSRV örneğine bakın.
<?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);
}
?>

Ayrıca Bkz.

Nasıl yapılır: Windows Kimlik Doğrulaması Kullanarak Bağlanma

Nasıl yapılır: SQL Server Kimlik Doğrulaması Kullanarak Bağlanma