2009-02-06 125 views
0

我正在設計一個高度併發的CCR應用程序,在這個應用程序中,我不會阻止或發送睡眠線程。SQLConnection Pooling - 處理InvalidOperationExceptions

我打的SQLConnection池的問題 - 試圖調用SqlConnection.Open

我有可能重試滿手的時候,特別是越來越InvalidOperationExceptions,但這不是真正解決問題。

對我來說,理想的解決辦法是定期重新檢查可用性被捆綁

任何想法一個線程,不需要連接的方法?

[更新] 這裏是一個相關的問題/溶液張貼在another forum

該解決方案需要手動管理的連接池。我寧願有一個更具動態性的解決方案,即在需要時踢人

+0

代碼示例請? – 2009-02-06 03:09:08

+0

我認爲這是一個普遍的CCR問題,如果您已經熟悉CCR – 2009-02-06 03:19:31

回答

1

哈利,我也碰到過這個,同時還使用了CCR。我的經驗是,通過完全分離我的調度程序線程,阻止任何I/O,我可以比SqlConnection池能夠處理的更快地消耗和處理工作項目。一旦達到最大游泳池限制,我遇到了你所看到的那種錯誤。

最簡單的解決方案是預先分配一些非池異步SqlConnection對象並將它們發佈到一些中央端口<SqlConnection>對象。然後,當你需要執行一個命令,一個迭代器內這樣做的東西是這樣的:

public IEnumerator<ITask> Execute(SqlCommand someCmd) 
{ 
    // Assume that 'connPort' has been posted with some open 
    // connection objects. 
    try 
    { 
     // Wait for a connection to become available and assign 
     // it to the command. 
     yield return connPort.Receive(item => someCmd.Connection = item); 

     // Wait for the async command to complete. 
     var iarPort = new Port<IAsyncResult>(); 
     var iar = someCmd.BeginExecuteNonQuery(iarPort.Post, null); 
     yield return iarPort.Receive(); 

     // Process the response. 
     var rc = someCmd.EndExecuteNonQuery(iar); 
     // ... 
    } 
    finally 
    { 
     // Put the connection back in the 'connPort' pool 
     // when we're done. 
     if (someCmd.Connection != null) 
      connPort.Post(someCmd.Connection); 
    } 
} 

有關使用CCR中的好處是,它是微不足道的下面的功能添加到這個基本的代碼。

  1. 超時 - 只需進行初始接收(對於可用的連接),使用超時端口的「選擇」。
  2. 動態調整池大小。要增加池的大小,只需將一個新的打開的SqlConnection發佈到'connPort'。要減小池的大小,請在connPort上產生一個接收,然後關閉接收到的連接並將其丟棄。
0

是的,連接保持打開並且不在連接池中。在上面的例子中,端口池。