Anslutningspooler (Microsoft-drivrutiner för PHP för SQL Server)

Ladda ned PHP-drivrutin

Följande punkter är viktiga när det gäller anslutningspooler i Microsoft Drivrutiner för PHP för SQL Server:

  • Microsoft Drivers för PHP för SQL Server använder ODBC-anslutningspooler.

  • Som standard är anslutningspooler aktiverade i Windows. I Linux och macOS poolas anslutningar endast om anslutningspooler är aktiverade för ODBC (se Aktivera eller inaktivera anslutningspooler). När anslutningspoolen är aktiverad och du ansluter till en server försöker drivrutinen använda en poolanslutning innan den skapar en ny. Om det inte finns någon motsvarande anslutning i poolen skapas en ny anslutning och läggs till i poolen. Drivrutinen avgör om anslutningar är likvärdiga baserat på en jämförelse av anslutningssträngarna.

  • När en anslutning från poolen används återställs anslutningstillståndet (endast Windows).

  • När anslutningen stängs returneras anslutningen till poolen.

Mer information om anslutningspooler finns i Anslutningspooler för Driver Manager.

Aktivera/inaktivera anslutningspooler

Windows

Du kan tvinga drivrutinen att skapa en ny anslutning (i stället för att söka efter en motsvarande anslutning i anslutningspoolen) genom att ange värdet för attributet ConnectionPooling i anslutningssträngen till false (eller 0).

Om attributet ConnectionPooling utelämnas från reťazec pripojenia eller om det är inställt på true (eller 1), skapar drivrutinen bara en ny anslutning om det inte finns någon motsvarande anslutning i anslutningspoolen.

Anmärkning

Flera aktiva resultatuppsättningar (MARS) är aktiverat som standard. När både MARS och pooler används, för att MARS ska fungera korrekt, kräver drivrutinen en längre tid för att återställa anslutningen på den första frågan, vilket ignorerar alla angivna tidsgränser för frågor. Tidsgränsinställningen för frågan börjar dock gälla i efterföljande frågor.

Om det behövs kan du läsa Så här: Inaktivera flera aktiva resultatuppsättningar (MARS). Information om andra anslutningsattribut finns i Anslutningsalternativ.

Linux och macOS

Attributet ConnectionPooling kan inte användas för att aktivera eller inaktivera anslutningspooler.

Anslutningspooler kan aktiveras eller inaktiveras genom att redigera odbcinst.ini konfigurationsfilen. Drivrutinen ska läsas in igen för att ändringarna ska träda i kraft.

Inställningen Pooling till Yes och ett positivt CPTimeout värde i odbcinst.ini-filen aktiverar anslutningspooler.

[ODBC]
Pooling=Yes

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

Minst bör odbcinst.ini-filen se ut som i följande exempel:

[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

Genom att ställa in Pooling till No i filen odbcinst.ini tvingar drivrutinen att skapa en ny anslutning.

[ODBC]
Pooling=No

Anmärkningar

  • I Linux eller macOS rekommenderas inte anslutningspooler med unixODBC < 2.3.7. Alla anslutningar kommer att poolas om poolning är aktiverat i odbcinst.ini-filen, vilket innebär att anslutningsalternativet ConnectionPooling inte har någon effekt. Om du vill inaktivera poolning anger du Pooling=Nej i filen odbcinst.ini och läser in drivrutinerna igen.

    • unixODBC <= 2.3.4 (Linux och macOS) kanske inte returnerar korrekt diagnostikinformation, till exempel felmeddelanden, varningar och informativa meddelanden.
    • Därför kanske SQLSRV- och PDO_SQLSRV-drivrutiner inte kan hämta långa data (till exempel xml, binär) som strängar korrekt. Långa data kan hämtas som strömmar som en tillfällig lösning. Se följande exempel för SQLSRV.
  • När du använder AccessToken med anslutningspooler lägger drivrutinen till en hash för tokeninnehållet i anslutningsnyckelordet APP för att säkerställa att anslutningar med olika åtkomsttoken inte poolas tillsammans. Detta förhindrar korskontaminering av identiteter där en poolanslutning autentiserad som en identitet kan återanvändas för en annan identitet. Tokendata cachelagras med TTL-baserad förfallodatum för att säkerställa pekarstabilitet för ODBC-drivrutinen. Det här beteendet introducerades i version 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);
}
?>