Проблема ответа метода с WCF - PullRequest
0 голосов
/ 14 апреля 2011

У меня есть два метода, из которых первый я использую для вставки данных, а второй для получения текущего количества вставленных данных.Оба являются сервисными методами WCF.Мне нужно вставить массовые записи в базу данных, поэтому параллельно я хочу проверить, сколько записей вставлено.Для этого я использую свой второй метод.

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

Спасибо.

Ответы [ 4 ]

2 голосов
/ 14 апреля 2011

если ваша операция вставки работает в одной транзакции, то другая операция не сможет увидеть новые записи, пока транзакция не будет завершена.

вы можете выбрать выполнение (второй) операции выбора на read uncomitted уровне изоляции, если вы не возражаете, что результаты не будут на 100% точными и стабильными.

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

1 голос
/ 14 апреля 2011

Вы вызываете это из SQL Server?

Почему бы просто не запустить массовое обновление в отдельном потоке и просто быстро вернуть назад, что оно было поставлено в очередь и обрабатывается.

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

Тогда ваша вторая функция может проверить статус.

UPDATE:

У меня есть статический класс, который выполняет обработку, и код находится в конце. По сути, поступает вызов, и я сразу же возвращаюсь, чтобы он был успешно помещен в очередь. Очередь просто работает в фоновом режиме, проверяя каждые десять секунд и обрабатывая все, что там есть.

Я использую ConcurrentQueue для своей очереди, чтобы я мог писать и обрабатывать одновременно.

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

    public string[] UpdateJobs(Jobs[] jobs)
    {
        WebServiceControllerStatic.JobQueue = jobs;
        WebServiceControllerStatic.ProcessUpdateJobQueue();
        List<String> s = new List<String>();
        for (int t = 0; t < jobs.Length; t++)
        {
            s.Add("Success");
        }
        return s.ToArray();
    }

Они находятся в классе WebServiceControllerStatic:

    public static Jobs[] JobQueue
    {
        set
        {
            try
            {
                value.AsParallel().ForAll(i => jobqueue.Enqueue(i));
            }
            catch (Exception e)
            {
                writeToLog("..\r\n" + e.Message + "\r\n" + e.StackTrace);
            }
        }
    }

    public static void ProcessUpdateJobQueue()
    {
        Action UpdateJob = () =>
        {
            if (jobqueue.IsEmpty)
                return;
            Parallel.For(0, jobqueue.Count, new ParallelOptions() { MaxDegreeOfParallelism = 1 },
                (j) =>
                {
                    // Do updates here
                });
        };
        if (processUpdateJobThread == null)
        {
            processUpdateJobThread = new System.Threading.Thread(() =>
            {
                while (true)
                {
                    UpdateJob();
                    System.Threading.Thread.Sleep(10000);
                }
            });
            processUpdateJobThread.Start();
        }
    }
0 голосов
/ 15 апреля 2011

+ 1 в ответе @Menahem.

Кроме того, вам также следует рассмотреть возможность использования SqlBulkCopy вместо их вставки один за другим. По моему опыту, это значительно улучшит производительность.

0 голосов
/ 14 апреля 2011

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

Контракт должен выглядеть так:

Guild DoBulkInsert(string commands);

int? GetCount(Guid bulkId);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...