Проблема параллельного использования Hibernate в приложении Java SE - PullRequest
0 голосов
/ 29 марта 2012

Я создаю приложение Java SE, которое работает на Hibernate. В основном будет работать много экземпляров Java SE, и будет много фабрик Hibernate Session. Когда один клиентский компьютер вставляет объект в источник данных, другие клиенты не увидят его, пока я не очистлю кэш. Есть ли лучший механизм для использования в этом случае? Ниже мой метод очистки кэша.

public static void clearCache() {
        HibernateHelper.beginTranscation();
        HibernateHelper.getCurrentSession().clear();
        HibernateHelper.getSessionFactory().evictQueries();
        try {
            Map<String, ClassMetadata> classesMetadata = HibernateHelper
                    .getSessionFactory().getAllClassMetadata();
            for (String entityName : classesMetadata.keySet()) {
                HibernateHelper.getSessionFactory().evictEntity(entityName);
            }
        } catch (Exception e) {
        }
        HibernateHelper.commit();
    }

Обратите внимание, что я использую кэш второго уровня (Memcache) и кеш запросов.

1 Ответ

1 голос
/ 06 апреля 2012

То, как вы используете кэш L2, может привести к несогласованности данных, поскольку ваше приложение использует несколько фабрик сессий и, следовательно, оно распределено и нуждается в распределенном кеше .

Вот как выглядит ваша система

enter image description here

ИЛИ

В качестве альтернативы вы можете иметь центральный сервер memcache, который каждый из клиентов (споможет memcached клиент ).(Один memcached используется всеми пользователями)

Основное требование заключается в том, чтобы изменения , зафиксированные одним пользователем / фабрикой сеансов, были видны другим пользователям / фабрике сеансов для использования кэша.Приведенный вами пример кода бесполезен, поскольку он очищает кэш L2 каждый раз при совершении транзакции. В любом случае это делается кешем L2 или кешем сессии .

, поэтому мои предложения будут

  1. Не используйте кэш L2 вообще, следовательно, нет локального memcache.Вы все равно не используете его, так как очищаете кеш после каждой транзакции.
  2. Если вообще необходим кэш L2, используйте распределенный кеш (что немного сложнее) ИЛИ используйте один сервер memcached для всех.

Пожалуйста, проверьте эту ссылку .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...