【问题标题】:WIll Hibernate handle table "bait and switch"?Hibernate 会处理表“诱饵和切换”吗?
【发布时间】:2015-09-07 23:31:41
【问题描述】:

我有一个每天都在变化的庞大数据集,它绑定到一个 Java 对象。我的应用程序在 DAO 层中使用了 Hibernate。

当我更改数据时,我需要重建索引,但如果我在使用活动表时这样做,数据库将停止运行。

如果我有一个暂存表来上传我的所有新数据并在此处创建新索引,那么我是否可以在没有休眠通知的情况下删除实时表并重命名我的暂存表?

【问题讨论】:

  • 一般来说,是的,但是您仍然需要一个排他锁足够长的时间来交换表。它会减少影响,但不会消除影响。
  • “更改数据”是什么意思? Hibernate 在进程缓存中保留了一些可选...在不查询丢失表的情况下更改表的后勤工作将是锁定和操作更改的练习)

标签: java database spring hibernate postgresql


【解决方案1】:

我通过稍微改变我的数据结构解决了这个问题。

ALTER TABLE my_table RENAME to my_table_old;

然后我创建了一个与原始表同名的视图

CREATE OR REPLACE VIEW my_table AS
select * from my_table_old;

当我得到我的新数据集时,我会创建一个新表(在名称末尾附加序列)

EXECUTE 'CREATE TABLE my_table_'||nextval('seq_table_id')|| ' AS SELECT * FROM my_table_old WHERE 1=2;'

创建所有索引并分析它

EXECUTE 'CREATE INDEX idx_column1_'||currval('seq_table_id')|| ' ON my_table_'||
        currval('seq_table_id')||' USING btree(column1);'||
EXECUTE 'CREATE INDEX idx_column2_'||currval('seq_table_id')|| 
        ' ON my_table_'||currval('seq_table_id')||' USING btree(column2);'

虽然所有这些都完成了,但我的 web 应用程序继续映射到旧表,完全不受影响。

最后我分析一下表格

EXECUTE 'ANALYZE my_table_'||currval('seq_table_id');

一旦我对一切都感到满意,我会“做旧的切换器”,并将我的视线指向新的桌子

EXECUTE 'CREATE OR REPLACE VIEW my_table AS SELECT * FROM my_table_'||(SELECT last_value FROM seq_table_id)||';';

一切都立即切换,已经被索引,而 Hibernate 再聪明不过了!

【讨论】:

    【解决方案2】:

    不,您将不得不进行一些“计划停机”,在此期间您关闭应用程序,删除并重命名表,然后重新启动应用程序。

    由于删除“活动”表可能需要一些时间,您可能希望通过重命名两个表,然后重新启动应用程序来最大限度地减少停机时间。然后,您可以在闲暇时放下旧桌子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-24
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 2021-08-29
      相关资源
      最近更新 更多