繁体   English   中英

.NET 4中带有任务并行库的连接池

[英]Connection Pooling with Task Parallel Library in .NET 4

我有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”,因为默认连接池已为连接字符串启用i我没有设置任何与池相关的参数。 Shall i have to set the parameter regarding connection pooling? 对于我的情况

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

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

最好的办法是尝试在启用和禁用缓冲池的情况下尝试代码,并查看哪种更好(尝试尽可能紧密地模拟您的生产环境-网络延迟以及客户端和服务器的性能将对数据产生很大的影响) 。

您还可以使用ADO.NET( http://msdn.microsoft.com/zh-cn/library/ms254503.aspx )中内置的性能计数器来帮助您评估池是否在帮助您。 尝试在启用池的情况下运行代码,并查看NumberOfPooledConnections计数器-如果该值小于50,则说明您已成功重用连接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM