Mysql中的队列系统

时间:2014-12-08 10:29:00

标签: java mysql multithreading thread-safety queue

我需要在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语句怎么样?

2 个答案:

答案 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

不要忘记这样的情况,即你的工作可能会死亡或某些东西,可能有助于添加时间栏(如已启动或某事)并每隔几个小时清理一次

相关问题