【发布时间】:2014-02-06 09:52:45
【问题描述】:
SQL Server 11.0.3、C# .NET 4.5、WCF、EF v4.0.30319
我有下表存储查询:
OBJECT_TYPE OBJECT_NAME OBJECT_TYPE_NAME OBJECT_QUERY
1 HUB_PERSON HUB MERGE INTO ...
1 HUB_GPS HUB MERGE INTO ...
2 LNK_PERSON_GPS LNK MERGE INTO ...
2 SAT_CURR_PERSON SAT MERGE INTO ...
2 SAT_GPS SAT MERGE INTO ...
2 SAT_HIST_PERSON SAT MERGE INTO ...
我必须按照OBJECT_TYPE 列指定的顺序从我的服务中执行查询。具有相同OBJECT_TYPE 的查询可以按任何顺序执行,这就是为什么我想尽可能并行执行这些查询。
这是我目前正在使用的函数,没有并行性:
public int ExecuteLoadSources()
{
int nb = 0;
using (POCDVEntities POCDb = new POCDVEntities())
{
using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.Required))
{
IEnumerable<string> res = (
from a in POCDb.LOADING_SOURCE_QUERY
orderby a.OBJECT_TYPE
select a.OBJECT_SQLSRV_QUERY
);
foreach (string req in res)
{
POCDb.Database.ExecuteSqlCommand(req);
}
nb = POCDb.SaveChanges();
transaction.Complete();
}
}
return nb;
}
我试过这样Parallel.ForEach:
public int ExecuteLoadSources()
{
int nb = 0;
using (POCDVEntities POCDb = new POCDVEntities())
{
using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.Required))
{
IEnumerable<string> res = (
from a in POCDb.LOADING_SOURCE_QUERY
select a.OBJECT_SQLSRV_QUERY
);
int maxValue = (from a in POCDb.LOADING_SOURCE_QUERY select a.OBJECT_TYPE).Max();
for (int i = 1; i <= maxValue; i++)
{
IEnumerable<string> res2 = (
from a in POCDb.LOADING_SOURCE_QUERY
where a.OBJECT_TYPE == i
select a.OBJECT_SQLSRV_QUERY
).ToList();
Parallel.ForEach(res2, req2 =>
{
POCDb.Database.ExecuteSqlCommand(req2);
});
}
nb = POCDb.SaveChanges();
transaction.Complete();
}
}
return nb;
}
第一次运行该函数时,我得到The underlying provider failed on Open.,然后我再次尝试获取Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
我做得对吗? 有什么建议吗?
【问题讨论】:
-
好吧,我不认为
SqlConnection可以同时从多个线程中使用,即使使用 MARS。而Parallel.ForEach会将ExecuteSqlCommand放到另一个线程上,这可能会使TransactionScope无用。 -
好的,所以我可以假设这是不可能的?
标签: c# sql-server linq entity-framework parallel.foreach