Организация пулов соединений (драйверы Майкрософт для PHP для SQL Server)
Ниже приведены важные моменты, связанные с пулом подключений в драйверах Майкрософт для 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 могут не иметь правильной выборки данных типа long (например, XML, двоичные) в виде строк. В качестве обходного пути можно получить данные типа long в виде потоков. Дополнительные сведения о SQLSRV см. в приведенном ниже примере.
<?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);
}
?>
См. также
Практическое руководство. Подключение с использованием проверки подлинности Windows
Практическое руководство. Подключение с использованием проверки подлинности SQL Server