2010-10-25 3 views
0

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

Мы используем postgres 8.3+ и hibernate 3.2.6. Внешний процесс «обновления» будет подключаться к db через PSQL.

Для некоторых небольших таблиц усечение и вставка внутри транзакции должны быть удовлетворительными.

Однако некоторые из таблиц довольно велики, и метод усечения/вставки, вероятно, заблокирует таблицу слишком долго.

В этом случае я рассматриваю как:

1) таблица переименования - т.е. загрузить новые данные в TABLE_B во время спящего режима отображается TABLE_A, а затем выполнить таблицу переименовать table_b-> TABLE_A через PSQL

-или-

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

-или-

3) создать и заполнить новую схему, а также изменить пользователь в Hibernate пути поиска раз новой схемы готов

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

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

р.

+0

извиняется за плохой вопрос, который может не иметь ни одного правильного ответа ... – pstanton

ответ

1

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

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

Смежные вопросы