Разбиение с Hibernate - PullRequest
       24

Разбиение с Hibernate

3 голосов
/ 29 апреля 2010

У нас есть требование ежедневно удалять данные из диапазона 200КБ. Наше приложение основано на Java / Java EE с использованием Oracle DB и инструмента Hibernate ORM.

Мы исследовали различные варианты, такие как

  1. Гибернация пакетной обработки
  2. Хранимая процедура
  3. Разделение базы данных

Наш администратор БД предлагает лучший способ разделения баз данных, поэтому мы можем легко воссоздавать и отбрасывать разделенную таблицу каждый день. Теперь проблема в том, что у нас есть 2 вида данных: один, который мы хотим удалять каждый день, а другой, который мы хотим сохранить. Предположим, эти данные хранятся в таблице «Торговля». Теперь с разметкой у нас есть 2 таблицы «Торговля». У нас уже есть слой DAO на основе Hibernate для извлечения / хранения сделок из / в БД. Когда мы решаем разделить базу данных, как мы можем контролировать сделки, в которых из двух таблиц происходит переход в спящий режим. По сути, я хочу, чтобы к концу дня сделки были удалены, чтобы перейти в секционированную таблицу, а сделки, которые я хочу сохранить, в основную таблицу. Подскажите, пожалуйста, как это возможно с Hibernate. Мы можем добавить дополнительный столбец, чтобы определить сделки, которые нужно удалить, но как мы можем гарантировать, что эти сделки должны идти в разделенную таблицу торговли с использованием hibernate.

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

Ответы [ 2 ]

1 голос
/ 30 апреля 2010

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

Вот для чего Осколки гибернации .

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

Вы можете использовать стратегию наследования hibernate.

Если при создании объекта вы знаете, что он будет удален к концу дня, вы можете создать VolatileTrade, который является подклассом Trade (без других атрибутов). Используйте стратегию «таблица на конкретный класс» ( раздел 9.1.5 справочной документации по hibernate 3.3) для отображения.

(Я думаю, я бы сделал абстрактную суперклассовую сделку и два конкретных подкласса: PersistentTrade и VolatileTrade, так что если у вас есть другие классы, которые, как вы знаете, будут ссылаться только на PersistentTrade (или Volatile), вы можете ограничить это в своем коде . Если вы использовали суперкласс Trade в качестве PersistentTrade, вы не сможете применить его.)

Волатильная сделка перейдет в одну таблицу, а «постоянная» сделка - в другую таблицу.

Имейте в виду, что вы не сможете установить ограничение fk для любой Сделки (постоянной и изменчивой) из другой таблицы в БД.

Тогда вам просто нужно очистить стол, когда захотите.

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

Разве не проще усечь таблицу?

...