Le pool de connections ne fonctionne pas avec le pilote ODBC 13 pour SQL Server pour Linux

Nous venons d'installer les derniers pilotes SQL 13 et les dernières extensions PHP sqlsrv et sqlsrv_pdo. Le regroupement de connections ne semble pas fonctionner.

  • Système d'exploitation: CentOS 7.2
  • PHP: PHP 7.0.12
  • Pilote SQL: Pilote ODBC 13 pour SQL Server

Résumé du test: Nous avons créé un script de test qui va se connecter à la database. Une fois le script exécuté, la connection est fermée, confirmée par la database.

odbcinst.ini:

[ODBC] Pooling = Yes [ODBC Driver 13 for SQL Server] Description=Microsoft ODBC Driver 13 for SQL Server Driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.1.0 UsageCount=1 CPTimeout=120 

Script de test incluant un timing (ms):

 $startTime = microtime(true); function printElapsedTimeSinceLastEvent($event=''){ global $startTime; $elapsed = microtime(true) - $startTime; echo $event . round($elapsed*1000) ."\n"; $startTime = microtime(true); } // Connection sqlsrv driver $pdo = new PDO ("sqlsrv:server=10.12.12.123;database=aDatabaseName",'coolUser','someAwesomePassword'); printElapsedTimeSinceLastEvent("Connected: "); $stmt = $pdo->prepare("SELECT TOP 10 * FROM users"); $stmt->execute(); printElapsedTimeSinceLastEvent("Execute: "); $array = $stmt->fetchAll(PDO::FETCH_ASSOC); printElapsedTimeSinceLastEvent("Fetch: "); 

3 sorties consécutives de script:

 Connected: 149 Execute: 109 Fetch: 2 Connected: 149 Execute: 100 Fetch: 2 Connected: 152 Execute: 108 Fetch: 2 

En utilisant SQL Studio et en exécutant EXEC sp_who2, nous pouvons voir que les connections sont fermées après chaque exécution. L'utilisation de sqlsrv sous Windows maintient les connections ouvertes comme prévu et apparaît dans la sortie sp_who2.

Sous Windows, où nous avons confirmé que le regroupement de connections existe, le time de connection est nettement plus rapide que ce à quoi on s'attendrait avec le regroupement de connections.

Microsoft a reconnu le bogue et a depuis publié une nouvelle version qui prend en charge le pooling.