У меня есть клиентское приложение, запрашивающее некоторую информацию с URL-адреса каждые 1 секунду.Общая java HashMap в кластерной среде
На сервере (сервлет & JSP-приложение), чтобы избежать доступа к БД, когда это не является необходимым, было реализовано следующее решение. Вот фрагмент:
//a static HashMap where we save the last record inserted in db
public static Map<Long, Long> VALUES = new HashMap<Long, Long>();
// A lastRecordRead sent by the client
if (VALUES.get(id) != lastRecordRead) {
//Access the database to get some information
//cause the last value read is different from the last record inserted
...
}else{
//Do nothing
//It's not necessary access DB cause the parameters match
}
Это работало так, как ожидалось, в среде разработки.
Проблема возникает, когда у нас есть кластерная среда. У нас есть сервер, развернутый в двух узлах (с использованием jboss), каждый из которых имеет свой собственный HashMap и собственные значения. Таким образом, в зависимости от узла, на который мы атакуем, мы можем получить разные значения ...
¿Есть ли способ поделиться этим HashMap между двумя узлами? Я искал какой-то ответ, где мне не нужно обновлять 2 карты, то есть не звонки между узлами ...
Любая помощь будет оценена.
EDIT: Я сейчас играю с HazelCast, и, кажется, так легко, что я боюсь, что я делаю что-то неправильно ...
В моем сервере я использую сейчас HazelCast вместо HasMap :
public static Map<Long, Long> VALUES = (Hazelcast.newHazelcastInstance(new Config())).getMap("VALUES");
При записи вставляются:
if (((VALUES.get(id) == null)||(VALUES.get(id) < lastIdInserted))) {
VALUES.put(id, lastIdInserted);
}
Когда сервер вызывается клиентским приложением:
// A lastRecordRead sent by the client
if (VALUES.get(id) != lastRecordRead) {
//Access the database to get some information
//cause the last value read is different from the last record inserted
...
}else{
//Do nothing
//It's not necessary access DB cause the parameters match
}
И я думаю, вот и все. Может ли кто-нибудь подтвердить, что это нормально, или я что-то не хватает ...? Действительно ли это решение заполняется по всем узлам? Я делаю тесты с 2 котами, и это работает, но будет ли работать с разными ips?
Заранее благодарен!
Думаю, я собираюсь попробовать memcached. Если это сработает, я отвечу на правильный ответ. Фрагмент будет оценен, хотя ... Большое спасибо! – elcadro
Проверьте эту статью http://www.javaworld.com/article/2078584/open-source-tools/use-memcached-for-java-enterprise-performance--part-2--database-driven-web-apps. html Также есть примеры кода. –
Еще раз спасибо. Я использую jdbc вместо hibernate, но это может помочь в любом случае ... Насколько я знаю, после прочтения некоторых статей в Интернете, похоже, что для использования memcached вам необходимо установить приложение сервера и, кроме клиента ... это верно? В этом случае, возможно, использование других опций, как Halzelcast, кажется лучшим вариантом для меня ... – elcadro