3

我们要求每天从数据库中删除 200K 范围内的数据。我们的应用程序是基于 Java/Java EE 的,使用 Oracle DB 和 Hibernate ORM 工具。

我们探索了各种选择,例如

  1. 休眠批处理
  2. 存储过程
  3. 数据库分区

我们的 DBA 建议数据库分区是最好的方法,因此我们可以每天轻松地重新创建和删除分区表。现在的问题是我们有两种数据,一种我们想每天删除,另一种我们想保留它。假设此数据存储在“Trade”表中。现在有了分区,我们有 2 个表“Trade”。我们已经存在基于 Hibernate 的 DAO 层来从/向 DB 获取/存储交易。当我们决定对数据库进行分区时,如何通过hibernate来控制交易进入两张表中的哪一张。基本上我想要,交易需要在一天结束时删除,进入分区表和我想保留的交易,在主表中。请建议如何使用 Hibernate 实现这一点。

如果有人能提出更好的方法以防我们走错路,我将不胜感激。

4

2 回答 2

1

当我们决定对数据库进行分区时,如何通过hibernate来控制交易进入两张表中的哪一张。

这就是Hibernate Shards的用途。

于 2010-04-30T07:51:36.907 回答
0

您可以使用休眠继承策略。

如果您在对象创建时知道它将在一天结束时被删除,您可以创建一个作为 Trade 子类的 VolatileTrade(没有其他属性)。使用“每个具体类的表”策略( hibernate 3.3 参考文档的第 9.1.5 节)进行映射。

(我想我会做一个抽象的超类 Trade,以及两个具体的子类:PersistentTrade 和 VolatileTrade,所以如果你有一些其他类你知道只会引用 PersistentTrade(或 Volatile),你可以在你的代码中限制它。如果你已将 Trade 超类用作 PersistentTrade,您将无法强制执行。)

波动性交易将进入一张桌子,而“持续”交易将进入另一张桌子。

请注意,您将无法对数据库中其他表的任何 Trade(持久性和易失性)设置 fk 约束。

然后你只需要在你想要的时候清理桌子。

小心定义锁定机制,以便在删除和创建期间没有其他线程会尝试将数据写入表(如果您使用它)。这不是一件容易的事,正确地做这件事可能会影响在表中插入数据的所有操作的性能(因为它需要获取锁)。

截断表格不是更容易吗?

于 2010-05-01T19:18:37.850 回答