JPA с несколькими серверами - PullRequest
4 голосов
/ 10 августа 2010

В настоящее время я работаю над проектом, который использует JPA (Toplink, в настоящее время) для его сохранения. В настоящее время мы работаем с одним сервером приложений, но для избыточности мы хотели бы добавить балансировщик нагрузки и другой сервер приложений (и, возможно, больше по мере его роста).

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

Наряду с этим конкретным вопросом меня интересует любой, кто внедрил решение JPA с несколькими серверами приложений и какие проблемы возникли во время реализации (и любые ваши предложения).

Большое спасибо.

1 Ответ

6 голосов
/ 10 августа 2010

Как вы обнаружили, вы можете отключить общий кэш, см. http://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching или http://wiki.eclipse.org/EclipseLink/FAQ/How_to_disable_the_shared_cache%3F

В EclipseLink также доступны другие опции в зависимости от ваших данных и требований.

Список параметров включает в себя:

  1. Отключить общий кэш

  2. Включить координацию кэша (см., http://www.eclipse.org/eclipselink/api/2.1/org/eclipse/persistence/config/PersistenceUnitProperties.html#COORDINATION_PROTOCOL)

  3. Установить таймаут недействительности кэша (см., http://www.eclipse.org/eclipselink/api/2.1/org/eclipse/persistence/annotations/Cache.html#expiry%28%29)

  4. Включить оптимистическую блокировку, это гарантирует, что любой устаревший объект не может быть обновлен, и при обновлении устаревших данных произойдет сбой,и EclipseLink автоматически сделает недействительным объект в кэше.

  5. Изучите интеграцию Oracle TopLink с EclipseLink и Oracle Coherence для предоставления распределенного кэша.

См. Также, http://en.wikibooks.org/wiki/Java_Persistence/Caching#Caching_in_a_Cluster

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

...