2014-02-17 2 views
0

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

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

Я также попытался с инициализацией критериев для заказа, но не успел.

Может кто-нибудь предложить подходящий подход? Все предложения/комментарии приветствуются. Заранее спасибо.

+0

Может показаться полезным код –

+0

Реализовать механизм блокировки с использованием базы данных должен помочь – Sanjeev

+0

techG: его обширный, создающий здесь создаст много шума. Кроме того, я нажимаю этот код из отдельного кода, чтобы создать новый порядок. Просто предположите, что часть кода должна быть поражена пользователем, имитируемо из двух разных браузеров. Как я могу остановить это? Но пользователи должны иметь возможность ударить по всем другим заказам. Следует избегать одновременного попадания в тот же порядок. – Bhaskar

ответ

0

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

0

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

Добавить поле версии для вашего объекта заказа. После размещения заказа (в первый раз) версия является 1. Каждое обновление должно потом в порядке от этого, так себе два последующих параллельных процессов

a -> Read data (version=1) 
    Update data 
    Store data (set version=2 if version=1) 

b -> Read data (version=1) 
    Update data 
    Store data (set version=2 if version=1) 

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

Если вы используете JPA, оптимистичная блокировка так же просто, как добавление атрибута @Version к вашей модели. Если вы используете сырые JDBC, вам нужно будет добавить добавить его в состояние обновления

update table set version=2, data=xyz where orderid=x and version=1 

, что на сегодняшний день является лучшим и в самом деле предпочтительным решением вашей общей проблемы.

Смежные вопросы