[英]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.