Обнаружено, что OleDBConnection не похоже на ThreadSafe. Похоже, вместо этого он пытается открыть несколько подключений.
//doesn't work
using (OleDbConnection oConn = TheDataAccessLayer.GetConnection())
using (OleDbTransaction oTran = oConn.BeginTransaction())
Parallel.ForEach(ORMObjects, (ORMObject, State) =>
{
if (!State.ShouldExitCurrentIteration && !State.IsExceptional)
{
var Error = ORMObject.SomethingThatExecutesANonQuery(oConn,oTran)
if (Error.Number != 0)
State.Stop();
}
});
Если Я блокирую соединение для ExecuteNonQuery, ошибки исчезают, но снижается производительность.
//works
using (OleDbConnection oConn = TheDataAccessLayer.GetConnection())
using (OleDbTransaction oTran = oConn.BeginTransaction())
Parallel.ForEach(ORMObjects, (ORMObject, State) =>
{
if (!State.ShouldExitCurrentIteration && !State.IsExceptional)
{
lock(oConn)
{
var Error = ORMObject.SomethingThatExecutesANonQuery(oConn,oTran)
if (Error.Number != 0)
State.Stop();
}
}
});
Предположим,
Я не могу изменить природу ORM: SQL не может быть массовым
Бизнес правила требуют, чтобы взаимодействие выполнялось в рамках одной транзакции
Итак:
Есть ли более лучший / более эффективный способ распараллеливания взаимодействий OleDb?
Если нет, есть ли альтернатива клиенту OleDb, которая может полное преимущество параллелизма? (Может быть, собственный клиент MSSQL?)