使用Hibernate进行分区

3
我们有一个需求,每天从数据库中删除20万条数据。我们的应用程序是基于Java / Java EE,使用Oracle DB和Hibernate ORM工具。我们探讨了各种选项,如Hibernate批处理、存储过程和数据库分区。我们的DBA建议使用数据库分区是最好的方法,因此我们可以轻松地每天重新创建和删除分区表。现在问题是我们有两种数据,一种是每天要删除的,另一种是要保留的。假设这些数据存储在表“Trade”中。现在使用分区后,我们有了两个名为“Trade”的表。我们已经存在基于Hibernate的DAO层从/到数据库获取/存储交易。当我们决定对数据库进行分区时,如何通过Hibernate控制交易进入哪个表。基本上我想,需要在一天结束时删除的交易放在分区表中,而我想保留的交易放在主表中。请建议如何使用Hibernate实现这一点。我们可以添加一个附加列以标识要删除的交易,但如何确保这些交易应该进入分区交易表而不是主表。如果我们走错了路,请建议任何更好的方法。

1
也许你可以创建一个每天运行并删除可删除记录的Quartz作业。我不会在基于Oracle的机制上这样做。 - khmarbaise
我们有一个庞大的数据集,需要删除其中200K范围内的数据。通过石英定时任务,首先搜索这个数据范围,然后再删除将是非常低效的解决方案,而且在删除操作期间无法从数据库中读取任何内容。因此,我们决定采用基于分区的方法。 - Alex
2个回答

1
当我们决定对数据库进行分区时,如何通过Hibernate控制交易进入哪个表中。这就是Hibernate Shards的作用。

它还在开发中吗?上次我看到它们卡在一些非常困难的问题上...(而sf.net上的最后一次提交是在2009年1月21日完成的) - Thierry
@Thierry 据我所知,该项目已经包含在Hibernate组合中。您有任何特定的Jira问题吗?您缺少哪些需要开发的附加功能? - Pascal Thivent
不,我只是阅读了参考文档以了解它的功能。我看到了许多限制(例如“分片”查询不支持去重或排序)。由于该项目已经超过一年没有更新了,我只是想知道它是否还在维护中。 - Thierry
@Thierry 嗯,我想这是一种良性循环(或恶性循环,你怎么想都可以):更多的用户,更多的需求,更多的活动,更多的功能,更多的用户,以此类推。 - Pascal Thivent
好的,那么对于用户来说有什么信息呢?我看到它仍处于测试版阶段。它准备好用于生产环境了吗?GA发布的时间表是什么? - Alex
@Alex 你知道,有时候Beta版本的软件也可以是生产级别的,这并不意味着太多(如果他们将beta2重命名为GA,你会感觉更好吗?)。我的建议是:检查Hibernate Shards是否包含您需要的功能,并进行测试。就我个人而言,我认为Shards已经足够好用了。请查看此帖子以获取官方反馈。 - Pascal Thivent

0

您可以使用Hibernate继承策略。

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

(我认为我会做一个抽象超类Trade和两个具体子类:PersistentTrade和VolatileTrade,这样如果您有一些其他类只会引用PersistentTrade(或Volatile),您可以在代码中限制它。如果您使用Trade超类作为PersistentTrade,您将无法强制执行。)

易失性交易将进入一个表格,而“持久性”交易将进入另一个表格。

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

然后,您只需在需要时清除表格即可。

请注意定义锁定机制,以便在删除和创建表时没有其他线程尝试写入数据。这不是一项容易的任务,正确执行可能会影响插入表中数据的所有操作的性能(因为它需要获取锁)。

直接截断表不是更容易吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接