연결 풀링(Microsoft Drivers for PHP for SQL Server)
다음은 MICROSOFT Drivers for PHP for SQL Server의 연결 풀링과 관련하여 유의해야 할 중요한 사항입니다.
Microsoft Drivers for PHP for SQL Server는 ODBC 연결 풀링을 사용합니다.
Windows에서 연결 풀링은 기본적으로 사용으로 설정되어 있습니다. Linux 및 macOS에서 연결 풀링은 ODBC에 대해 연결 풀링을 사용하도록 설정한 경우에만 풀링됩니다(연결 풀링 사용/사용 안 함 참조). 연결 풀링을 사용하도록 설정하고 서버에 연결하는 경우 드라이버는 풀링된 연결을 사용하여 새 연결을 만듭니다. 해당 연결이 풀에 없는 경우 새 연결이 만들어지고 풀에 추가됩니다. 드라이버는 연결 문자열 비교에 따라 연결이 동일한지 여부를 결정합니다.
풀에서 연결을 사용하면 연결 상태가 초기화됩니다(Windows만 해당).
연결을 닫으면 풀에 대한 연결을 반환합니다.
연결 풀링에 대한 자세한 내용은 드라이버 관리자 연결 풀링을 참조하세요.
연결 풀링 사용/사용 안 함
Windows
드라이버가 연결 풀에서 동등한 연결을 찾는 대신 강제로 새로 연결하도록 연결 문자열의 ConnectionPooling 특성 값을 false(또는 0)로 설정하면 됩니다.
연결 문자열에서 ConnectionPooling 특성이 생략되거나 true(또는 1)로 설정된 경우 드라이버는 연결 풀에 동등한 연결이 없는 경우에만 새 연결을 만듭니다.
참고 항목
MARS(Multiple Active Result Set)는 기본적으로 사용으로 설정됩니다. MARS와 풀링이 모두 사용 중인 경우, MARS가 올바르게 작동하려면 드라이버가 첫 번째 쿼리에서 연결을 초기화하기 위해 더 오랜 시간이 필요하므로 지정된 쿼리 시간 제한을 무시합니다. 그러나 후속 쿼리에서는 쿼리 제한 시간 설정이 적용됩니다.
필요한 경우 방법: Multiple Active Resultsets(MARS)를 사용하지 않도록 설정을 확인하세요. 연결 특성에 대한 내용은 연결 옵션을 참조하세요.
Linux 및 macOS
ConnectionPooling 특성은 연결 풀링을 사용/사용 안 함으로 설정하기 위해 사용할 수 없습니다.
odbcinst.ini 구성 파일을 편집하여 연결 풀링을 사용/사용하지 않도록 설정할 수 있습니다. 변경 내용을 적용하려면 드라이버를 다시 로드해야 합니다.
odbcinst.ini 파일에서 Pooling
을 Yes
로 설정하고 양수 CPTimeout
값을 설정하면 연결 풀링을 사용할 수 있습니다.
[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
odbcinst.ini 파일에서 Pooling
를 No
로 설정하면 드라이버가 강제로 새 연결을 만듭니다.
[ODBC]
Pooling=No
설명
- Linux 또는 macOS에서는 2.3.7 이전의 unixODBC를 사용한 연결 풀링을 권장하지 않습니다. odbcinst.ini 파일에서 풀링을 사용하도록 설정한 경우 모든 연결이 풀링되며, 이는 ConnectionPooling 연결 옵션이 적용되지 않는다는 의미입니다. 풀링을 사용하지 않도록 설정하려면 odbcinst.ini 파일에서 Pooling=No를 설정하고 드라이버를 다시 로드합니다.
- 2.3.4 이하 unixODBC(Linux 및 macOS)는 오류 메시지, 경고 및 정보 메시지와 같은 적절한 진단 정보를 반환하지 않을 수 있습니다.
- 이러한 이유로 SQLSRV 및 PDO_SQLSRV 드라이버는 긴 데이터(예: xml, 이진)를 문자열로 올바르게 가져오지 못할 수 있습니다. 해결 방법으로 긴 데이터를 스트림으로 가져올 수 있습니다. 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);
}
?>