【发布时间】:2013-04-30 12:14:40
【问题描述】:
我有一个用 Java 编写的程序,它创建了 5 个从 Oracle 中选择数据的线程。 选择是这样的:
select * from queue_requests where request_status = 0 and date_requested <= sysdate and rownum <= ? for update skip locked
我将参数设置为1024。我经常得到以下结果(使用System.out.println):
线程 0 更新 1024
线程 4 更新 0
线程 1 更新 0
线程 2 更新 0
线程 3 更新 0
因此,只有一个线程找到要更新的行。 根据我在不同文章中的发现,我认为 oracle 首先应用 rownum 子句,然后应用 for update skip locked,因此所有线程都会尝试更新前 1024 行。 我可能会使用类似的东西:
select * from (select * from queue_requests where request_status = 0 and date_requested <= sysdate for update skip locked) where rownum <= ?
但这会锁定所有行,然后返回其中的一部分。我不想锁定所有行。
我找到了一个创建存储过程的解决方案,但我无法更改数据库中的任何内容。我还发现了一些关于高级队列的东西,但我不确定我需要这么复杂的东西(我也没有找到任何好的例子)。
这个问题有解决办法吗?
【问题讨论】:
-
SKIP LOCKED 用于队列处理,即获取队列中下一个解锁的东西。所以这个想法是从堆栈顶部只取一件事。每次抓一小把表明你没有正确设计你的队列。我知道 FOR UPDATE SKIP LOCKED 允许我们选择多行,我只是认为我们不应该。
标签: java oracle queue batch-processing