Обновите один объект в нескольких процессах в Java

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

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

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

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

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


person Random Dude    schedule 21.12.2009    source источник


Ответы (3)


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

person Asaph    schedule 21.12.2009
comment
Позвольте мне спросить вас об этом. Каким будет отпечаток памяти? Будет ли терракота поддерживать несколько копий объекта в нескольких JVM? и обновлять их синхронно? или будет ли он поддерживать одну копию и создавать иллюзию для разных процессов, что у них есть собственная копия? - person Random Dude; 16.03.2010
comment
@Random Dude: я точно не знаю ответа на этот вопрос. Мой опыт работы с Terracotta ограничивается просмотром двухчасовой презентации одного из специалистов по Terracotta в группе пользователей Java в Сан-Диего. Я подозреваю, что Terracotta, вероятно, хранит весь граф объектов в памяти на каждой JVM в кластере и проксирует изменения на другие JVM. Но опять же, я не на 100% уверен в этом. Возможно, свяжитесь с людьми из Терракоты напрямую. - person Asaph; 17.03.2010

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

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

person John Ellinwood    schedule 21.12.2009

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

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

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

person Taylor Gautier    schedule 23.12.2009