многопоточность с базой данных - PullRequest
3 голосов
/ 16 ноября 2011

Я ищу стратегию использования многопоточности (возможно, асинхронных делегатов) для выполнения синхронной операции.Я новичок в многопоточности, поэтому сначала я опишу свой сценарий.Эта синхронная операция прямо сейчас выполняется для одного набора данных (портфеля) на основе предоставленных параметров.Реализация (psudeo-code) приведена ниже:

public DataSet DoTests(int fundId, DateTime portfolioDate)
{
    // Get test results for the portfolio
    // Call the database adapter method, which in turn is a stored procedure,
    // which in turns runs a series of "rule" stored procs and fills a local temp table and returns it back.
    DataSet resultsDataSet = GetTestResults(fundId, portfolioDate);

    try 
    {

        // Do some local processing on the results
        DoSomeProcessing(resultsDataSet);

        // Save the results in Test, TestResults and TestAllocations tables in a transaction.

        // Sets a global transaction which is provided to all the adapter methods called below
        // It is defined in the Base class
        StartTransaction("TestTransaction");    

        // Save Test and get a testId
        int testId = UpdateTest(resultsDataSet);    // Adapter method, uses the same transaction

        // Update testId in the other tables in the dataset
        UpdateTestId(resultsDataSet, testId);

        // Update TestResults
        UpdateTestResults(resultsDataSet);          // Adapter method, uses the same transaction

        // Update TestAllocations
        UpdateTestAllocations(resultsDataSet);      // Adapter method, uses the same transaction

        // It is defined in the base class
        CommitTransaction("TestTransaction");
    }
    catch
    {
        RollbackTransaction("TestTransaction");
    }
        return resultsDataSet;
}

Теперь требуется сделать это для нескольких наборов данных.Одним из способов было бы вызвать вышеуказанный метод DoTests() в цикле и получить данные.Я бы предпочел делать это параллельно.Но есть определенные ловушки:

  • StartTransaction() метод создает соединение (и транзакцию) каждый раз, когда он вызывается.
  • Все базовые таблицы базы данных, процедуры одинаковы для каждоговызов DoTests(). (очевидно).

Таким образом, мой вопрос таков:

  • Будет ли использование многопоточности в любом случае улучшать производительность?
  • Каковы шансытупик, особенно когда создаются новые TestId и сохраняются тесты, TestResults и TestAllocations?Как можно обработать эти взаимоблокировки?
  • Есть ли другой, более эффективный способ выполнения вышеуказанной операции, кроме многократного повторения метода DoTests()?

1 Ответ

0 голосов
/ 18 ноября 2011

Надеюсь, я полностью понимаю, что вы имеете в виду.1. Да, если вы вызовете DoTests несколько раз в разных потоках, производительность вашего кода будет лучше.Предполагая, что вы не заблокированы внутри ваших GetTestResults и UpdateXXX методов.2. Это в основном зависит от вашей реализации методов, которые вы вызываете (GetTestResults и UpdateXXX методов) 3. Вы собирались вызвать несколько DoTests одновременно, правильно?Так почему вы спрашиваете о простом цикле?

На самом деле я не совсем понял вас о транзакциях.Насколько я понимаю, каждый экземпляр вы будете использовать свою собственную транзакцию, правильно?В противном случае, я полагаю, у вас возникнут проблемы с сериализацией обновлений транзакций.

...