2013-05-28 49 views
2

我在C#中創建了一個.Net 3.5 Web服務,它通過ODBC與Progress OpenEdge數據庫進行通信。如何限制.Net Web應用程序的ODBC連接數量?

此數據庫已設置爲僅允許Web服務正在使用的用戶帳戶(第三方限制)上的10個同時連接。

當Web服務獲取大量併發請求並嘗試連接到每個請求的數據庫時,我遇到了一個巨大的問題。當超過連接限制時,數據庫將在幾分鐘內拒絕新的傳入連接。

Web服務在Windows Server 2008上運行。 爲ODBC驅動程序啓用連接池。

我不知何故將不得不限制我的Web服務試圖做出的連接數,但我不知道如何。我正在使用的Progress OpenEdge ODBC驅動程序不支持最大池大小參數。

我一直在閱讀大量的文檔資料,從微軟關於這個問題,但我已經能夠得出結論是:

  • ,連接池是默認啓用
  • 連接池無法從配置我的應用程序
  • 默認最大池大小爲100
  • 沒有辦法改變的最大池大小,除非駕駛員使用的是支持它

有人可以證實這一點,和/或建議一種方法來限制在這種情況下的連接數量?非常感謝:)

回答

1

您可以嘗試所提到的WCF方法,也可以通過編程實現連接池。

public interface IService 
{ 
    void Execute(Action<IDbConnection> command); 
    T Execute<T>(Func<IDbConnection, T> command); 
} 

public sealed class ConnectionManager : IService 
{ 
    public const int MaxConnections = 10; 

    private readonly string _connectionString; 
    private readonly SemaphoreSlim _workers = new SemaphoreSlim(0, MaxConnections); 

    public ConnectionManager(string connectionString) 
    { 
     _connectionString = connectionString; 
    } 

    public void Execute(Action<IDbConnection> command) 
    { 
     lock(_workers) 
     { 
      using(var connection = new OdbcConnection(_connectionString)) 
      { 
       connection.Open(); 
       command(connection); 
      } 
     } 
    } 

    public T Execute<T>(Func<IDbConnection, T> command) 
    { 
     lock(_workers) 
     { 
      using(var connection = new OdbcConnection(_connectionString)) 
      { 
       connection.Open(); 
       return command(connection); 
      } 
     } 
    } 
} 

SemaphoreSlim會阻止打開假設被稱爲不會嘗試任何晦澀難懂的代碼超過10個連接。

+0

嗯,有趣。我確實想過在這裏使用信號量,但我認爲它不會因爲範圍問題而工作。這裏的信號量變量的範圍是什麼?如果我的Web服務獲取來自不同用戶/機器的請求,IIS是否不會創建我的類的多個實例,從而創建信號量的多個實例,從而使其無用? –

+0

您可以創建'SemaphoreSlim'靜態或創建'ConnectionManager'的靜態實例。我在想後一種情況,因爲你可能有多個Progress OpenEdge服務器,它們會有不同的'ConnectionManager'。 – Romoku

+0

哦,我不知道靜態變量也是Web應用程序中的應用程序範圍。那很好知道。對我來說,這似乎是最好的解決辦法;易於實現,我更喜歡讓應用程序自己管理連接的想法。我會在星期五試試這個,我會在這裏發佈結果。 –

0

你可以考慮配置WCF服務,只允許10個併發請求。這隻適用於每個請求使用不超過1分貝連接的情況,當然,對於您的特定服務而言可能有意義或無意義。

+0

我實際上使用的是ASP.NET web服務。這仍然可以配置嗎?如果是這樣;怎麼樣?我是否在IIS,代碼或web.config中配置? –

+0

您可以在IIS配置中執行此操作: http://www.iis.net/configreference/system.applicationhost/sites/site/limits – jlew

+0

謝謝。雖然我不使用它,但很高興知道:) –

0

聽起來像我的應用程序的架構應該重新考慮。 我會處理這種情況,有一個單獨的線程(或多個線程)連接到您的Web服務中的數據庫。 Web服務然後可以管理連接到數據庫的線程。

爲簡單起見,假定只有一個連接到數據庫。

當您收到Web服務的請求時,服務會將請求放入共享數據庫線程的隊列中。

數據庫線程只會坐在那裏,直到隊列中有東西要處理。 如果有,它會將其從隊列中取出並將請求發送到服務器。

在拾取返回的數據時,您可能還需要做一些額外的工作,因爲數據將在不同的線程上返回到請求的線程。

可以使用相同的原則有多個線程(每個允許的連接一個) 然後,您將編寫一個類來管理這些線程,以便每個線程只需從隊列中取出下一個項目。

相關問題