Hibernate целостность базы данных с несколькими приложениями Java - PullRequest
4 голосов
/ 12 мая 2010

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

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

<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-го уровня, поскольку это создает еще один уровень сложности, и мы более чем довольны уровнем производительности, который мы получаем от приложения в целом.

Значит ли реализация шаблона открытия сеанса в веб-приложениях и ручное управление сеансами в автономных приложениях звучит так, как если бы это было исправлено?

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

Ответы [ 2 ]

3 голосов
/ 12 мая 2010

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

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

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

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

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

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

0 голосов
/ 21 мая 2010

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

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

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

...