Pool di connessioni (Driver Microsoft per PHP per SQL Server)

Download del driver PHP

I punti seguenti sono importanti per il pool di connessioni nei driver Microsoft per PHP per SQL Server:

  • I driver Microsoft per PHP per SQL Server usano i pool di connessioni ODBC.

  • Per impostazione predefinita, i pool di connessioni sono abilitati in Windows. In Linux e macOS le connessioni vengono raggruppate solo se il pool di connessioni è abilitato per ODBC (vedere Abilitazione o disabilitazione del pool di connessioni). Quando il pool di connessioni è abilitato e ci si connette a un server, il driver tenta di usare una connessione in pool prima di crearne una nuova. Se non viene trovata una connessione equivalente nel pool, viene creata e aggiunta una nuova connessione al pool. Il driver determina se le connessioni sono equivalenti confrontando le stringhe di connessione.

  • Quando viene usata una connessione del pool, lo stato della connessione viene ripristinato (solo Windows).

  • Quando si chiude la connessione, questa viene riportata al pool.

Per altre informazioni sui pool di connessioni, vedere Pool di connessioni di Gestione driver.

Abilitazione e disabilitazione del pool di connessioni

Windows

È possibile forzare il driver a creare una nuova connessione, anziché cercarne una equivalente nel pool di connessioni, impostando il valore dell'attributo ConnectionPooling nella stringa di connessione su false o 0.

Se l'attributo ConnectionPooling viene omesso dal stringa di connessione o se è impostato su true (o 1), il driver crea una nuova connessione solo se non esiste una connessione equivalente nel pool di connessioni.

Nota

Multiple Active Result Set (MARS) è abilitato per impostazione predefinita. Quando sia MARS che il pooling sono in uso, affinché MARS funzioni correttamente, il driver richiede un tempo più lungo per reimpostare la connessione alla prima query, ignorando così qualsiasi timeout di query specificato. Tuttavia, l'impostazione di timeout della query ha effetto nelle query successive.

Se necessario, vedere Procedura: Disabilitare più set di risultati attivi (MARS). Per informazioni sugli altri attributi di connessione, vedere Connection Options.

Linux e macOS

L'attributo ConnectionPooling non può essere usato per abilitare o disabilitare il pool di connessioni.

Il pool di connessioni può essere abilitato o disabilitato modificando il file di configurazione odbcinst.ini. Per rendere effettive le modifiche, è necessario ricaricare il driver.

Impostando Pooling su Yes e un valore positivo CPTimeout nel file odbcinst.ini, si abilita il pool di connessioni.

[ODBC]
Pooling=Yes

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

Come minimo, il file odbcinst.ini dovrebbe essere simile all'esempio seguente:

[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

L'impostazione di Pooling su No nel file odbcinst.ini impone al driver di creare una nuova connessione.

[ODBC]
Pooling=No

Osservazioni:

  • In Linux o macOS non è consigliabile usare pool di connessioni con unixODBC < 2.3.7. Poiché tutte le connessioni vengono raggruppate se il pooling è abilitato nel file odbcinst.ini, ciò significa che l'opzione di connessione ConnectionPooling non ha alcun effetto. Per disabilitare il pool, impostare Pooling=No nel file odbcinst.ini e ricaricare i driver.

    • unixODBC <= 2.3.4 (Linux e macOS) potrebbe non restituire informazioni di diagnostica appropriate, ad esempio messaggi di errore, avvisi e messaggi informativi.
    • Per questo motivo, i driver SQLSRV e PDO_SQLSRV potrebbero non essere in grado di recuperare correttamente dati lunghi (ad esempio xml, binary) come stringhe. I dati del tipo Long possono essere ottenuti come flussi, come soluzione alternativa. Vedere l'esempio seguente per SQLSRV.
  • Quando si usa AccessToken con il pool di connessioni, il driver aggiunge un hash del contenuto del token alla APP parola chiave di connessione per garantire che le connessioni con token di accesso diversi non vengano raggruppate tra loro. Ciò impedisce la contaminazione incrociata dell'identità in cui una connessione in pool autenticata come un'identità può essere riutilizzata per un'identità diversa. I dati dei token vengono memorizzati nella cache con scadenza basata su TTL per garantire la stabilità del puntatore per il driver ODBC. Questo comportamento è stato introdotto nella versione 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);
}
?>