Hibernate целостность базы данных с несколькими приложениями java


У нас есть 2 веб-приложения java, оба из которых предназначены для чтения / записи, и 3 автономных приложения java для чтения/записи (одно загружает вопросы по электронной почте, одно обрабатывает XML-канал, одно отправляет электронную почту подписчикам).

Проблема, с которой мы недавно столкнулись, заключается в том, что вопросы, загруженные по электронной почте, иногда перезаписывают вопросы, созданные в одном из веб-приложений. Обратите внимание, что это отдельные вопросы, которые должны иметь отдельные идентификаторы. мы изначально думали, что это кэширование вопрос. Мы пытались отключить кэш второго уровня, но это ничего не меняет.
<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.cache.use_second_level_cache">false</property>

Вопрос:

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false)
@DocumentId
public Integer getId() {
    return this.id;
}

Мы используем MySQL кстати.

CREATE TABLE  `question` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  ...
  PRIMARY KEY (`id`),
  ...
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Мы явно не открываем и закрываем сессии, а скорее позволяем hibernate управлять ими через Util.getSessionFactory().getCurrentSession().

Мы бы предпочли не устанавливать кластеризованный кэш 2-го уровня на этом этапе, поскольку это создает еще один уровень сложности, и мы более чем довольны уровнем производительности, который мы получаем от приложения в целом.

Итак может ли реализация шаблона open-session-in-view в веб-приложениях и ручное управление сеансами в автономных приложениях помочь решить эту проблему?

Или любые другие предложения/идеи, пожалуйста?

2 4

2 ответа:

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

Предполагая, что вам не нужно хранить вопросы в виде прозрачных объектов в памяти, но что вы выбираете все вопросы для каждого их представления, у меня есть одно простое предложение.

Замените генератор идентификаторов последовательностью в базе данных. (В конечном итоге ID как autonumber в MySql). Тогда база данных вместо приложений гарантирует, что каждый вопрос получает уникальный идентификатор.

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

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

Надеюсь, это поможет!

Оказывается, эта проблема не была связана с гибернацией вообще.

Одна из таблиц базы данных на промежуточном сервере была заполнена старыми данными, которые должны были быть очищены. Это изначально создавало впечатление, что id перезаписывается, но дальнейшее расследование доказало обратное!

Как только мы удалили сомнительные данные, все было хорошо.