存储过程中是否存在SLEEP()的方法?

时间:2012-05-12 00:07:40

标签: mysql sleep

我有一个存储过程我想永远运行,但在循环中睡一秒钟。当它醒来时,它会轮询一个表,看它是否应该做一些工作。工作只需要每分钟完成,因此不必担心民意调查表会同时受到来自两位作家的更新的影响。

存储过程中间隔SLEEP()的最佳方法是什么?实际上,如果它能够睡眠200毫秒,那将会很好,但是一秒钟也可以工作。

5 个答案:

答案 0 :(得分:21)

我遇到了同样的问题。经过Google搜索后,我发现我们可以使用

SELECT SLEEP(<seconds>);

延迟我们的程序这么多秒。在您的情况下,使用

SELECT SLEEP(0.2);

会没事的。

答案 1 :(得分:3)

答案 2 :(得分:1)

MySQL内置了一个事件调度程序。https://dev.mysql.com/doc/refman/5.6/en/events-overview.html

示例:

CREATE EVENT performance_schema_snapshots.fill_events_statements_summary_by_digest_history1
  ON SCHEDULE -- every day at 6 am 
    EVERY 1 DAY
    STARTS TIMESTAMP(CURRENT_DATE) + INTERVAL 1 DAY + INTERVAL 14 HOUR
  DO
    -- take snapshot 
    CALL performance_schema_snapshots.events_statements_summary_by_digest_snapshot_reset (); 

答案 3 :(得分:0)

你没有指定你正在使用哪个数据库,但一般来说,获得你想要的东西的方法不是拥有一个infinetly运行的sproc,而是拥有一些外部组件 - 比如调度程序或MSSQL中的SQL Server代理 - 执行sproc每隔一段时间。

答案 4 :(得分:0)

我会使用cron(linux)或Windows Task Scheduler(windows)来安排它每分钟运行一次,然后让你的存储过程完成它的任务,然后退出。

让存储过程“永远”运行是真的坏主意。你有长期连接(可能会死),你可能无意中锁定了一个表(永远)等等。

由于它们彼此无关,因此将“循环”与“任务”分开是一种很好的设计,这意味着您可以使用最适合每个部分的(不同)工具。