SQL Server 11.0.3, C# .NET 4.5, WCF, EF v4.0.30319ExecuteSqlCommand параллельное выполнение
У меня есть следующая таблица, в которой хранить запросы:
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.
, то я попробуйте еще раз get Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
Имею ли я это правильно? Любые предложения?
Ну, для одного я не думаю, что один 'SqlConnection' может использоваться из нескольких потоков одновременно, даже с MARS. И это 'Parallel.ForEach' поместит' ExecuteSqlCommand' в другой поток, который может сделать этот «TransactionScope» бесполезным. –
ОК, так что я могу просто предположить, что это невозможно? – Yann39