Каковы стратегии синхронизации для Prevayler? - PullRequest
5 голосов
/ 18 января 2009

Prevayler гарантирует, что все записи (через свои транзакции) синхронизированы. Но как насчет чтения?

Правильно ли, что грязное чтение возможно, если не используется явная синхронизация (в коде пользователя)?

Возможны ли они, если бизнес-объект читается как:

// get the 3rd account
Accont account = (Bank)prevayler.prevalentSystem().getAccounts().get(2);

Если так, какие стратегии синхронизации хороши для кода пользователя?

(Рассмотрим бизнес-объект A, содержащий коллекцию бизнес-объектов Bs),

  • с использованием синхронизированной коллекции (например, B внутри A) из пакета java.util.concurrent?
  • синхронизировать чтение коллекций вне транзакций с коллекция записывает внутри транзакций, например, используя "синхронизированный (сборник)" код вокруг чтения и записи?

Ответы [ 2 ]

4 голосов
/ 26 января 2009

Рекомендуется использовать JMatch Query и Prevayler.execute (Query). Либо напрямую, либо с использованием подклассов.

Возвращаемые результаты должны быть либо примитивными значениями, либо неизменяемыми объектами. Если вы планируете возвращать изменяемые объекты, вы должны создать подкласс JMatch Query для выполнения этих глубоких копий. Таким образом, вы получаете систему, которая блокирует каждое разумное чтение с другими (разумными) чтениями и записями. Это может ускорить и упростить разработку, особенно для разработчиков, не имеющих опыта многопоточного программирования.

Если вам требуется более высокая производительность при высокой одновременной нагрузке, что, как предполагается, является редким случаем, вы действительно можете использовать описанную выше мелкозернистую блокировку - используя «synchronized» и java.util.concurrent.

Подробнее см. .

1 голос
/ 24 января 2009

Прошло очень много времени с тех пор, как я смотрел на Prevayler (я использовал его в проекте POC около 6 или 7 лет назад). Я совершенно уверен, что если все ваши операции чтения и записи выполняются через Prevayler, дальнейшая синхронизация не требуется - конечно, мне не нужно было делать то, что я делал, и это имело несколько потоков, использующих хранилище данных.

...