我需要在Mysql中创建一个Queue表,它将由Java应用程序访问,队列中的Jobs由使用PHP的Web应用程序生成。
队列必须作为First in first out队列工作,除非具有高度优先级的任务排队。
任务完成后,将被删除。
我的队列表如下所示:
CREATE TABLE `queue` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`priority` int(11) NOT NULL DEFAULT '10',
`status` tinyint(4) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `idx_prio_id` (`priority`,`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
由于我的Java应用程序是多线程的,我需要使队列选择语句是线程安全的,因此每个任务只处理一次。
select / update语句怎么样?
答案 0 :(得分:0)
SQL不是存储队列的好地方。像ActiveMQ这样的JMS服务器就是为此而设计的。
永远不会......
您可以通过锁定对此表的访问来在Java中执行同步。然后,您需要一个查询来获取最小id
的行,另一个删除它。
答案 1 :(得分:0)
添加“process-id”之类的列。
然后使用pid = processid执行update queue set status = x, pid = pid where status = y LIMIT 1
,使用x = int运行,使用y = int进行等待。
然后选择这个做你的工作select .... where status = y and pid = pid
不要忘记这样的情况,即你的工作可能会死亡或某些东西,可能有助于添加时间栏(如已启动或某事)并每隔几个小时清理一次