Обновите один объект для нескольких процессов в Java - PullRequest
2 голосов
/ 21 декабря 2009

Пара таблиц реляционных БД управляется одним кешем объектов, который находится в процессе. Когда кеш фиксируется, таблицы обновляются. Реляционные таблицы БД обновляются обычными запросами SQL, а не чем-то более изощренным, например, hibernate.

В конце концов, другие процессы вступили в дело изменения этого объекта без связи друг с другом, т. Е. Каждый процесс инициализировал бы этот объект (считывал из БД) и обновлял его (передавал в БД), а другой процесс не знал бы об этом держась за устаревший кеш.

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

Однако у этого подхода есть пара проблем. 1) Каждый объект, возвращаемый этим кешем, является mBean, что может сделать вызовы метода довольно болтливыми. 2) Также существует требование, чтобы каждый процесс видел согласованную модель данных (кэш) БД и по возможности объединял свое содержимое с БД. (как транзакция). Если БД была значительно обновлена ​​каким-либо другим процессом, то слияние может быть неудачным.

Какие технологии в Java помогут решить эту проблему?

Ответы [ 3 ]

3 голосов
/ 21 декабря 2009

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

0 голосов
/ 23 декабря 2009

Согласен с Джоном - используйте кэш второго уровня в спящем режиме с поддержкой кластеризации. Гораздо более простой способ управления данными с помощью упрощенной модели доступа к данным и позволяющий Hibernate управлять деталями.

Terracotta Ehcache - один из таких кешей, как и JBoss, Coherence и т. Д.

Более подробную информацию о Кэше второго уровня Hibernate можно найти здесь и в официальных документах Hibernate в главе 19. Повышение производительности (обратите внимание, что пока документы Hibernate перечисляют второй уровень поставщики кэша, список крайне устарел, например, кто использует Swarm Cache? Последний выпуск этого был в 2003 году)

0 голосов
/ 21 декабря 2009

Если вы хотите сохранить объектную модель, вы можете использовать java объектный кеш для централизованного хранения перед фиксацией. Или вы можете сохранить общую блокировку, используя zookeeper .

Но, похоже, вам действительно следует отказаться от самоуправляемого кэша. Используйте hibernate или другую JPA реализацию, о которой вы упоминали. JPA решает проблемы с кешем и поддерживает общий кеш L2, поэтому они подумали об этом за вас.

...