Лучший способ гарантировать согласованность данных между одновременными вызовами веб-службы? - PullRequest
0 голосов
/ 04 февраля 2009

Несколько клиентов одновременно получают доступ к веб-сервису JAX-JWS, работающему на Glassfish или каком-либо другом сервере приложений. Постоянство обеспечивается чем-то вроде Hibernate или OpenJPA. База данных - Microsoft SQL Server 2005.

Служба принимает несколько входных параметров, возникает некоторая «магия», а затем возвращает то, что в основном является преобразованной версией следующего доступного значения в последовательности, причем определенная последовательность и преобразование определяются входными данными. «Магия», которая выполняет преобразование, зависит от входных параметров и различных таблиц базы данных (описывающих взаимосвязь между входными параметрами, преобразованием, последовательностью получения следующего базового значения и списком уже обслуживаемых значений для конкретной последовательности. ). Не уверен, что все это может быть заключено в хранимую процедуру (возможно), но также не уверен, хочет ли клиент этого там.

Каков наилучший способ обеспечения согласованности (т. Е. Каждое значение является уникальным, и значения используются по порядку, без возможности получения значения для клиента без сохранения в базе данных) при сохранении производительности?

Ответы [ 2 ]

2 голосов
/ 04 февраля 2009

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

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

0 голосов
/ 04 февраля 2009

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

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

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

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