Hibernate实现队列

时间:2014-09-08 07:01:21

标签: multithreading hibernate

我有一个Quartz计划,它在TblTransactions表中插入数据。我想运行另一个具有多个实例/线程的Quartz调度,它将从TblTransactions获取记录,进行一些处理并删除记录。

如何确保线程获取的记录不会被另一个线程获取?

我可以将oracle高级队列与hibernate集成吗?我还可以考虑其他选择吗?

我正在使用Hibernate和Oracle 11g。

1 个答案:

答案 0 :(得分:0)

如果多个线程正在读取同一个表,即使您以某种方式将它们标记为在数据库中获取(另一个线程可以在事务提交之前读取该行),也不会两次获取相同的记录。 / p>

我实现这一点的方法是使用单个线程来获取记录,然后将它们拆分以进行处理并将N条记录委托给每个处理器线程,并使用Futures或回调来跟踪进度(因此,如果某个处理器线程失败,我知道重新提交记录以进行处理和/或记录/通过电子邮件发送错误以提醒管理员,以便他们知道在无效数据等情况下检查它。

处理器线程可以在完成后自行删除已处理的记录(在处理完一条记录后立即删除,或者在处理完所有记录后一次性删除),或者您可以拥有在fetch-thread中映射以将记录映射到处理器线程,并且一旦线程成功完成,就删除它处理的所有记录。

如果定期调用抓取操作,并且处理中仍然可能存在旧记录,那么您可能需要在fetch-thread -side中进行映射以了解所获取的记录是否包含已经存在的记录从早期的fetch-run处理。

相关问题