Windows

ODBC 連接在負載下停止工作

  • May 5, 2019

全部

我們有一個執行帶有 IIS 10 和 PHP 7.1.16 的 Windows Server 2016 的系統。這些腳本通過 ODBC 連接到 SQL Server 數據庫。它在正常情況下執行良好,但我們每週五都會出現激增,因為人們試圖在周末之前完成工作。與數據庫的連接時不時地開始失敗,但繼續嘗試最終會讓您通過。

我的 Db 連接腳本如下(該函式允許我在需要時輕鬆地即時建立新連接,因為 SQL Server 需要在送出新查詢之前關閉先前的語句):

<?php

include "config.inc.php";

function DBConnFactory()
{
   return new PDO($dsn='odbc:Driver={SQL Server};Server='.DB_INST.';Database='.DB_DATABASE.';APP=WhatsMyAppAgain;Trusted_Connection='.DB_TRUST);
}
try
{
   $db=DBConnFactory();
}
catch (Exception $e)
{
   error_log($e->getMessage().' in '.$e->getFile().', on line '.$e->getLine());
   die('Can\'t connect to the database!');
}

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

// leave the ending tag off, otherwise you could get 
// random whitespace that could block header changes.

當它開始失敗時,我在日誌中收到以下消息:

[19-Oct-2018 17:38:42 Australia/Sydney] SQLSTATE[] SQLDriverConnect: 0  in C:\inetpub\wwwroot\WhatsMyAppAgain\LIVE\dbconn.inc.php, on line 7
[19-Oct-2018 17:38:43 Australia/Sydney] SQLSTATE[] SQLDriverConnect: 0  in C:\inetpub\wwwroot\WhatsMyAppAgain\LIVE\dbconn.inc.php, on line 7
[19-Oct-2018 17:39:10 Australia/Sydney] SQLSTATE[] SQLDriverConnect: 0  in C:\inetpub\wwwroot\WhatsMyAppAgain\LIVE\dbconn.inc.php, on line 7
[19-Oct-2018 17:44:28 Australia/Sydney] SQLSTATE[] SQLDriverConnect: 0  in C:\inetpub\wwwroot\WhatsMyAppAgain\LIVE\dbconn.inc.php, on line 7
[19-Oct-2018 17:45:13 Australia/Sydney] SQLSTATE[] SQLDriverConnect: 0  in C:\inetpub\wwwroot\WhatsMyAppAgain\LIVE\dbconn.inc.php, on line 7
[19-Oct-2018 17:46:15 Australia/Sydney] SQLSTATE[] SQLDriverConnect: 0  in C:\inetpub\wwwroot\WhatsMyAppAgain\LIVE\dbconn.inc.php, on line 7
[19-Oct-2018 17:48:25 Australia/Sydney] SQLSTATE[] SQLDriverConnect: 0  in C:\inetpub\wwwroot\WhatsMyAppAgain\LIVE\dbconn.inc.php, on line 7

事件查看器中沒有任何錯誤可以提供有關正在發生的事情的任何線索。我知道它不是 SQL 伺服器,因為我的開發環境連接到同一個 SQL 伺服器,我沒有看到那裡的問題,當問題影響 LIVE 環境時,QA 環境(在同一台伺服器上)受到影響也是。

我已經創建了通過同一個 ODBC 創建任意數量的連接的存根腳本,但是即使我創建了 3,000 個連接(即使每個人都試圖立即跳上該站點也遠遠超出了該站點將創建的數量),我無法重現這一點。

我已將其替換為Microsoft 的 PDO SQL Server 驅動程序,此後我們沒有遇到任何問題。

引用自:https://serverfault.com/questions/936540