所有池化连接都在使用中,并且达到了最大池大小

时间:2012-04-27 17:36:06

标签: sql-server-2008

我正在编写一个

的.NET 4.0控制台应用程序
  1. 打开连接使用数据读取器光标键列表

  2. 对于每个密钥读取,请调用Web服务

  3. 将数据库服务的结果存储在数据库

  4. 然后我产生了这个过程的多个线程,以便改善我每秒可以处理的最大记录数。

    当我将该过程超过大约30个左右的线程时,我收到以下错误:

    System.InvalidOperationException: Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.   This may have occurred because all pooled connections were in use and max pool size was reached.
    

    是否有服务器或客户端选项进行调整以允许我从连接池中获取更多连接?

    我正在调用sql 2008 r2 DATABASE。

    THX

3 个答案:

答案 0 :(得分:1)

这听起来像是一个设计问题。您从数据库中获得的总记录数是多少?通过阅读器迭代将真正快速。即使你有成千上万的行,通过那个阅读器也会很快。这是您可以采取的不同方法:

遍历阅读器并将数据存储在对象列表中。然后以您选择的数量(例如,一次两个,一次三个等)遍历您的对象列表,并生成该数量的线程以并行调用您的Web服务。

这样您就不会打开与数据库的多个连接,并且您正在并行处理可能是真正的瓶颈(对Web服务的HTTP调用)。

以下是一个例子:

List<SomeObject> yourObjects = new List<SomeObject>();

if (yourReader.HasRows) {
    while (yourReader.Read()) {
        SomeObject foo = new SomeObject();
        foo.SomeProperty = myReader.GetInt32(0);
        yourObjects.Add(foo);
    }
}

for (int i = 0; i < yourObjects.Count; i = i + 2) {
    //Kick off your web service calls in parallel.  You will likely want to do something with the result.
    Task[] tasks = new Task[2] {
        Task.Factory.StartNew(() => yourService.MethodName(yourObjects[i].SomeProperty)),
        Task.Factory.StartNew(() => yourService.MethodName(yourObjects[i+1].SomeProperty)),
    };

    Task.WaitAll(tasks);
}

//Now do your database INSERT.

答案 1 :(得分:0)

为您的所有请求打开新连接难以置信效率低下。如果您只是想使用相同的连接来继续请求,那就更有可能了。您可以打开连接,然后通过该连接运行尽可能多的SqlCommand命令。只需保持ONE连接,并在完成所有线程后处理它。

答案 2 :(得分:-1)

请重新启动您可以连接的IIS