我正在开发一个高使用率的系统,它会映射一些“只读”表和视图。在不同的时间点,我需要通过外部连接到数据库,用更新的版本替换这些表中的数据。
我们正在使用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查询)被重新命名)所以一些理论意见将不胜感激。
如果有人尝试过类似的方法或者知道潜在的陷阱,我将非常感激......
第
答案 0 :(得分:1)
您可以通过重命名事务中的表来利用PostgreSQL的MVCC。这将从任何其他运行和未来事务的角度确保原子性。
从Hybernate的角度来看,缓存无效应该足以确保检索数据的新鲜度。