在hibernate运行时更改模式

时间:2010-10-25 05:01:05

标签: hibernate postgresql

我正在开发一个高使用率的系统,它会映射一些“只读”表和视图。在不同的时间点,我需要通过外部连接到数据库,用更新的版本替换这些表中的数据。

我们正在使用postgres 8.3+和hibernate 3.2.6。外部“更新”过程将通过PSQL连接到数据库。

对于某些较小的表,事务中的截断和插入应该是令人满意的。

但是有些表非常大,truncate / insert方法可能会将表锁定太长时间。

在这种情况下,我正在考虑:

1)表重命名 - 即将新数据加载到table_b中,同时将hibernate映射到table_a,然后通过PSQL从table_b-> table_a执行表重命名

-OR -

2)始终将hibernate映射到视图,并且当填充table_b时,重新定义视图以路由到table_b而不是现在冗余的table_a。

-OR -

3)创建并填充新模式,并在新模式准备就绪后更改hibernate用户的搜索路径

我不是百分之百确定这些方法在hibernate中的影响,虽然我即将进行最佳测试,但我很难测试冲突(例如,对表进行hibernate查询)被重新命名)所以一些理论意见将不胜感激。

如果有人尝试过类似的方法或者知道潜在的陷阱,我将非常感激......

1 个答案:

答案 0 :(得分:1)

您可以通过重命名事务中的表来利用PostgreSQL的MVCC。这将从任何其他运行和未来事务的角度确保原子性。

从Hybernate的角度来看,缓存无效应该足以确保检索数据的新鲜度。