Spring: лучший способ обрабатывать длительные вызовы веб-сервисов с помощью транзакционных методов БД? - PullRequest
2 голосов
/ 21 апреля 2011

У нас есть метод обслуживания, который выполняет примерно следующее:

@Transactional
public void serviceMethod(...){
   for(Item i : bunchOfItems){
      webServices.webServiceCall(...);
      dao.daoUpdateMethod(...);
   }
}

Проблема заключается в том, что как только происходит обновление БД удерживает блокировку на таблице на время транзакции (веб-служба вызывает среднее значение) 5 секунд каждый). Любое исключение в вызове веб-службы или вызове DAO, конечно, должно вызвать полный откат.

Как лучше всего подойти к этой ситуации?

Ответы [ 3 ]

3 голосов
/ 21 апреля 2011

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

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

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

Вы можете делать все это разными способами:

  • последовательный - 2 цикла, одна транзакция и битовая память: цикл через все вызовы веб-службы сохраняет результаты в массиве, открывает транзакцию, а затем зацикливает все результаты и сохраняет их
  • последовательный - один цикл и n транзакция: в цикле сначала вызовите веб-сервис для одного элемента, затем запустите новую транзакцию и сохраните ее (конец цикла)
  • параллельно - параллельно вызывать веб-сервис - вы можете комбинировать его с двумя способами, упомянутыми выше , как Дж. Б. Низет предложил свой ответ
0 голосов
/ 26 апреля 2011

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

Режим MVCC позволяет выполнять чтение во время незавершенного обновления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...