Организация пулов соединений (драйверы Майкрософт для PHP для SQL Server)

Скачать драйвер PHP

Следующие моменты важны для пула подключений в драйверах Microsoft для PHP для SQL Server.

  • Драйверы Майкрософт для PHP для SQL Server используют пул подключений ODBC.

  • По умолчанию организация пулов подключений в Windows включена. В Linux и macOS подключения объединяются только в том случае, если пул подключений включен для ODBC (см. раздел "Включение или отключение пула подключений"). Если пул соединений включен и вы подключаетесь к серверу, драйвер пытается использовать соединение из пула соединений перед созданием нового. Если эквивалентное подключение не найдено в пуле, создается новое подключение и добавляется в пул. Драйвер определяет эквивалентность соединений путем сравнения строк подключения.

  • При использовании соединения из пула выполняется обнуление состояния соединения (только Windows).

  • После закрытия соединения оно возвращается в пул.

Дополнительные сведения о пуле подключений см. в статье Driver Manager Connection Pooling.

Включение и отключение группировки подключений

Windows

Можно настроить драйвер на принудительное создание нового подключения (вместо поиска эквивалентного подключения в пуле подключений), задав для атрибута ConnectionPooling в строке подключения значение false (или 0).

Если атрибут ConnectionPooling опущен из строка подключения или если для него задано значение true (или 1), драйвер создает новое соединение, только если эквивалентное подключение отсутствует в пуле соединений.

Примечание.

По умолчанию множественные активные результирующие наборы (MARS) включены. При использовании MARS и пула для корректной работы MARS драйверу требуется больше времени на сброс подключения при первом запросе, что приводит к игнорированию установленного времени ожидания запроса. Однако параметр времени ожидания запроса вступает в силу в последующих запросах.

При необходимости см. Как отключить несколько активных наборов результатов (MARS). Сведения о других атрибутах соединения см. в статье Connection Options.

Linux и macOS

Атрибут ConnectionPooling нельзя использовать для включения или отключения пула подключений.

Пул подключений можно включить или отключить, изменив файл конфигурации odbcinst.ini. Чтобы изменения вступили в силу, необходимо перезагрузить драйвер.

Если установить для параметра Pooling значение Yes и положительное значение CPTimeout в файле odbcinst.ini, это позволяет использование пула подключений.

[ODBC]
Pooling=Yes

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

Как минимум, файл odbcinst.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

Установка значения Pooling на No в файле odbcinst.ini приводит к тому, что драйвер создаёт новое соединение.

[ODBC]
Pooling=No

Замечания

  • В Linux или macOS не рекомендуется использовать пулы соединений с unixODBC < версии 2.3.7. Если в файле odbcinst.ini включен пул, то все подключения будут помещены в пул, что означает, что параметр подключения ConnectionPooling не действует. Чтобы отключить группировку, установите Pooling=No в файле odbcinst.ini и перезапустите драйверы.

    • unixODBC <= 2.3.4 (Linux и macOS) может не возвращать правильные диагностические сведения, такие как сообщения об ошибках, предупреждения и информационные сообщения.
    • По этой причине драйверы SQLSRV и PDO_SQLSRV могут не иметь возможности правильно получать длинные данные (например, xml, двоичные) в виде строк. В качестве обходного решения данные типа long можно извлекать в виде потоков. См. следующий пример для SQLSRV.
  • При использовании AccessToken с пулом подключений драйвер добавляет хэш содержимого маркера к APP ключевому слову подключения, чтобы убедиться, что подключения с различными маркерами доступа не объединяются вместе. Это предотвращает перекрестное загрязнение удостоверений, когда подключение, аутентифицированное в пуле как одно удостоверение, может быть повторно использовано для другого удостоверения. Данные токена кэшируются с истекающим сроком действия на основе TTL, чтобы обеспечить стабильность указателя для драйвера ODBC. Это поведение было введено в версии 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);
}
?>