2013-11-25 3 views
1

У меня есть приложение, которое сравнивает сложный набор правил с транзакцией. Поскольку правила не меняются очень часто, и есть много транзакций, я создал правила из базы данных как singelton (RuleInfo). Когда правило изменено, я вызываю updateRuleInfo.Singleton на кластерных серверах

public static void updateRuleInfo(){ 
     instance = new RuleInfo();  

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

Есть ли способ обновить синглтон на всех узлах?

+0

Когда система запускает/перезагружается, откуда вы получаете исходное правило? Сохраняется ли она в базе данных? – isnot2bad

+0

Когда система запускается, она получает правила из базы данных. Перезапуск системы правильно заполняет все правила во всех узлах. Конечно, это не решение. – itsNotABlanket

ответ

3

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

Одним из способов достижения этой цели является использование шаблона публикации/подписки JMS. Разверните тему JMS; все сервисы singleton подписываются на эту тему и получают уведомление, когда изменяется их источник данных.

См. http://www.javaspecialists.eu/archive/Issue052.html (глава «Распределенные кешины с одним кешью»).

0

Singletons в качестве кластерной среды хитер

Проверить это решение:

Singleton Service

Hazelcast with a distributed lock

Memcache (если объем данных помещается в память)

Лучше всего, чтобы запустить одноплодные на каждом узле и получить данные из уникального бэкэнда

С уважением

+0

Singelton находится в коде на всех узлах, вопрос в том, как вызвать UPDATE, который отправляется всем узлам. – itsNotABlanket

+0

Попробуйте Hazelcast использовать карту/список в качестве кеша. Все узлы будут иметь некоторые части ваших данных. операции обновления, вставки и удаления всегда распространяются. Если вы получите доступ к кешу, вы получите все предметы – urbiwanus

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