ExecuteNonQuery параллельно в совместно используемом OleDbConnection / OleDbTransaction

Обнаружено, что 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?)

5
задан seraphym 9 October 2011 в 19:45
поделиться