哈利,我也碰到過這個,同時還使用了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中的好處是,它是微不足道的下面的功能添加到這個基本的代碼。
- 超時 - 只需進行初始接收(對於可用的連接),使用超時端口的「選擇」。
- 動態調整池大小。要增加池的大小,只需將一個新的打開的SqlConnection發佈到'connPort'。要減小池的大小,請在connPort上產生一個接收,然後關閉接收到的連接並將其丟棄。
代碼示例請? – 2009-02-06 03:09:08
我認爲這是一個普遍的CCR問題,如果您已經熟悉CCR – 2009-02-06 03:19:31