0

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

Код:

Сохранить апи:

@Transactional 
public ID save(T entity) { 
    EntityManager em = getEntityManager(); 
    if (em.contains(entity)) { 
     em.merge(entity); 
    } else { 
     em.persist(entity); 
    } 
    em.flush(); 
    return (ID) entity.getId(); 
} 

GET апи:

public T findOne(final ID id) { 
    EntityManager em = getEntityManager(); 

    T entity = em.find(getEntityClass(), id); 
    em.flush(); 
    return entity; 
} 
+0

Не могли бы вы показать соответствующую часть своего кода? – vanekjar

+0

Добавлен код ниже. – Ankush

+0

В какой версии dropwizard и hibernate вы были? –

ответ

0

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

Чтобы проверить это является причиной проблемы, активное ведение журнала для операторов SQL и транзакций и проверить

  1. , что ваши данные получает записаны в базу данных. Вы должны увидеть sql-statement для этого в журнале.

  2. , что сделка совершается после этого.

+0

Сохранить код объекта: @ Сохранение публичного идентификатора транзакции (T entity) { EntityManager em = getEntityManager(); если (em.contains (entity)) { em.слияния (юридическое лицо); } else { em.persist (entity); } em.flush(); return (ID) entity.getId(); } ...... Получить код объекта: public T findOne (идентификатор конечного идентификатора) { EntityManager em = getEntityManager(); T entity = em.find (getEntityClass(), id); em.flush(); объект возврата; } – Ankush

+0

.. После сохранения я могу видеть данные в базе данных и даже получать вызовы на сервере, на котором он был создан, но когда вызов get выполняется на сервере diff, я не могу найти эту запись. – Ankush

+0

@Ankush Вы не ожидаете, что кто-нибудь действительно прочитает код, который вы проглотили в комментарии, не так ли? –

1

Это проблема, которую имеет JPA.

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

Некоторые из функций, которые менеджер объектов делает для ускорения работы, - это кеширование и пакетные запросы.
кэширование является проблемой, потому что:

Server 1 commits a new object to the database, and the data is flushed 
Server 2 fetch request to get objects 
    Server 2 has the data its fetching in cache so it returns the data without the new object 

Существуют различные способы, чтобы убедиться, что это не случается:

1.) имеют один диспетчер объектов настроить службу на сервере, который обрабатывает все БД взаимодействия.

2.) Настройте главный диспетчер объектов, который синхронизирует данные (кеш) между менеджерами сущностей другого сервера.

Есть другие способы обойти это, но я считаю, что это лучшие два подхода.

Лучший ответ ---- JPA with Multiple Servers Основано на ссылке затмения.

+0

Какова стандартная практика? – Arjit

+0

@Arjit Что касается стандарта, я не уверен на 100%. Я использовал только то, что я перечислил. Кроме того, наш магазин был в основном db2/SQL, поэтому мы не были экспертами JPA. Тебе лучше спросить кого-то другого. (Идентификатор скорее не управляет вами неправильно) –