2

我有 exe 在服务器上连续运行以批处理数千个文件,文件中的数据被插入到数据库中,所有文件都使用相同的连接字符串。我已经使用 .net 4 的 TPL 来提高性能。代码的基本流程如下,因为我对连接池不太了解,所以下面的方法会给我带来麻烦请建议。谢谢。

流程:1.创建任务数组(50个文件大约50个任务)2.将每个任务添加到数组任务3.等待所有任务并重复接下来的50个文件

                   Task[] taskArry = new Task[50];
                    for (int i = 0; i < 50; i++)
                    {
                        taskArry[i]=(Task.Factory.StartNew(() =>                          InstanceDataObject.InserData()));

                        //var t2 = Task.Factory.StartNew(() => InsertData());
                    }

                         Task.WaitAll(taskArry);

这里要注意的关键点是,我正在为 InsertData() 方法中的每个任务启动我的连接对象,因为每个任务都必须使用事务执行,因此为 50 个任务创建了 50 个连接,这会影响性能吗?

    internal static void InserData(string insPath, int filingId)
        {
             try
            {
               DataAccess dataAcess = new DataAccess(true);
               // insert operation here
               dataAcess.CommitTransaction();
            }
            finally
            {
                 dataAcess.Dispose();
                _dbmanager = null;

            }
}

我正在使用像这样的连接字符串 "Server=Test;User id=user;Password=@1234;database=test" 因为连接字符串启用了默认连接池我没有设置任何与池相关的参数。Shall i have to set the parameter regarding connection pooling?对于我的场景

4

1 回答 1

0

理论上,是的,它应该更快。

实际上,这取决于InsertData()运行需要多长时间。如果它足够慢,那么 50 个任务中的每一个都可能最终创建自己的连接(因为池始终是空的),因此您将无法从连接池中获得任何优势。

最好的办法是在启用和禁用池的情况下尝试您的代码,看看哪个更好(尝试尽可能接近地模拟您的生产环境 - 客户端和服务器的网络延迟和性能会对您的数据产生很大的影响) .

您还可以使用 ADO.NET ( http://msdn.microsoft.com/en-us/library/ms254503.aspx ) 中内置的性能计数器来帮助您评估池是否对您有帮助。尝试在启用池的情况下运行您的代码并查看NumberOfPooledConnections计数器 - 如果它小于 50,那么您成功地重用了连接。

于 2013-05-09T00:19:49.647 回答