私はさまざまな一意のエンティティのストアドプロシージャを呼び出しようとしています。 1つのエンティティのストアドプロシージャには約33秒かかります。だから私はスレッドを使って呼び出すことにしました。それがうまく動作しますが、私は、レコードのアプリケーションからまたはバックエンドからチェックしたときに更新されませんように複数のレコードを更新するスレッド内のストアドプロシージャを呼び出す
public bool ExecuteTaxRateLinkingParallel(int mapID, int createdBy)
{
try
{
int snapshotID = (int)(HttpContext.Current.Session[GlobalConstant.snapShotID]);
List<TaxEntity> taxEntities = new List<TaxEntity>();
List<Task> tasks = new List<Task>();
using (var ctx = new TopazDbContainer())
{
taxEntities = ctx.TaxEntities.AsParallel().Where(t => t.IsActive == true).ToList<TaxEntity>();
}
Parallel.ForEach<TaxEntity>(taxEntities, (entity) =>
{
//SqlConnection connection; SqlTransaction trans; SqlCommand command;
// break this into pieces of 5
var task = Task.Factory.StartNew(() =>
{
using (var pctx = new TopazDbContainer())
{
try
{
int taxEntityID = entity.TaxEntityID;
pctx.CommandTimeout = 5000;
//string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["TOPAZDBConnectionStringParallel"].ConnectionString;
//connection = new SqlConnection(connectionString);
//command = new SqlCommand("dbo.[Usp_TaxRatesLinkingParallel]", connection);
//trans = connection.BeginTransaction();
//command.CommandType = CommandType.StoredProcedure;
//command.Parameters.AddWithValue("@MapID", mapID);
//command.Parameters.AddWithValue("@UserID", createdBy);
//command.Parameters.AddWithValue("@TaxEntityID", taxEntityID);
//command.Parameters.AddWithValue("@SnapshotID", snapshotID);
//connection.Open();
//command.CommandTimeout = 5000;
//command.ExecuteReader().AsParallel();
pctx.ContextOptions.LazyLoadingEnabled = true;
//pctx.ExecuteStoreCommand("Exec [Usp_TaxRatesLinkingParallel] @MapID={0},@UserID={1},@TaxEntityID={2},@SnapshotID{3}", new SqlParameter("MapID", mapID), new SqlParameter("UserID", createdBy), new SqlParameter("TaxEntityID", taxEntityID), new SqlParameter("SnapshotID", snapshotID));
var param = new DbParameter[] { new SqlParameter("UserID", createdBy), new SqlParameter("TaxEntityID", taxEntityID), new SqlParameter("SnapshotID", snapshotID) };
pctx.ExecuteStoreCommand("Exec [Usp_TaxRatesLinkingParallel] @MapID,@UserID,@TaxEntityID,@SnapshotID", param);
//var result = output.FirstOrDefault();
}
catch (TaskCanceledException tx)
{
}
catch (Exception e)
{
}
finally
{
pctx.SaveChanges();
pctx.Connection.Close();
}
}
}, TaskCreationOptions.PreferFairness);
tasks.Add(task);
try
{
Task.WaitAll(tasks.ToArray());
}
catch (AggregateException ae)
{
ae.Handle((x) =>
{
if (x is UnauthorizedAccessException)
{
return true;
}
else
{
return false;
}
});
}
catch (Exception ex)
{
throw ex;
}
});
return true;
}
catch (Exception ex)
{
TopazErrorLogs.AddTopazErrorLogBL(ex, 1, 1);
throw new TopazCustomException(GlobalConstant.errorMessage);
}
}
SPは思わいくつかの上記の文の場合:
は、ここで私が行っている臨床試験の一部です。
ヘルプが必要です。
なぜストアドプロシージャが長くかかるのですか?あなたはそれを並行して実行することが実際にあなたを助けるでしょうか? – svick
はい私たちはそれを並行して実行すると助けになります。一度にいくつかのテーブルを挿入したり更新したりするのには時間がかかります。 – Bilal
本当ですか?この時間がかかる場合は、データベースサーバーがディスク上で待機しているか、一部のデータベースロックで待機していることが原因です。その場合、並列化は役に立ちません。 – svick