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

StackOverflow https://stackoverflow.com/questions/2817092

Вопрос

У нас есть 2 веб-приложений Java Web.

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

<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 BTW.

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

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

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

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

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top