我有一个存储过程我想永远运行,但在循环中睡一秒钟。当它醒来时,它会轮询一个表,看它是否应该做一些工作。工作只需要每分钟完成,因此不必担心民意调查表会同时受到来自两位作家的更新的影响。
存储过程中间隔SLEEP()
的最佳方法是什么?实际上,如果它能够睡眠200毫秒,那将会很好,但是一秒钟也可以工作。
答案 0 :(得分:21)
我遇到了同样的问题。经过Google搜索后,我发现我们可以使用
SELECT SLEEP(<seconds>);
延迟我们的程序这么多秒。在您的情况下,使用
SELECT SLEEP(0.2);
会没事的。
答案 1 :(得分:3)
您可以使用:
DO SLEEP(0.2);
参考:http://dev.mysql.com/doc/refman/5.7/en/do.html
或
SELECT SLEEP(0.2);
参考:http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_sleep
答案 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)来安排它每分钟运行一次,然后让你的存储过程完成它的任务,然后退出。
让存储过程“永远”运行是真的坏主意。你有长期连接(可能会死),你可能无意中锁定了一个表(永远)等等。
由于它们彼此无关,因此将“循环”与“任务”分开是一种很好的设计,这意味着您可以使用最适合每个部分的(不同)工具。