Ответ 1
Я столкнулся с той же проблемой. После многого поиска я узнал, что мы можем использовать
SELECT SLEEP(<seconds>);
чтобы задержать наши процедуры за это много секунд. В вашем случае, используя
SELECT SLEEP(0.2);
будет просто отлично.
У меня есть хранимая процедура, которую я хотел бы запустить вечно, но спать в течение одной секунды в цикле. Когда он просыпается, он будет опросить таблицу, чтобы посмотреть, не должно ли она работать. Работу нужно выполнять каждую минуту, поэтому нет беспокойства о том, что стол для опроса попадает под обновления от двух авторов одновременно.
Каков наилучший способ SLEEP()
для интервала в хранимой процедуре? Было бы неплохо, если бы он мог спать 200 миллисекунд, но одна секунда тоже работала бы.
Я столкнулся с той же проблемой. После многого поиска я узнал, что мы можем использовать
SELECT SLEEP(<seconds>);
чтобы задержать наши процедуры за это много секунд. В вашем случае, используя
SELECT SLEEP(0.2);
будет просто отлично.
Вы можете использовать:
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
У 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 ();
Вы не укажете, какую базу данных вы используете, но в целом способ добиться того, что вы хотите, - это не иметь бесконечно запущенного sproc, но иметь какой-то внешний компонент - например, планировщик или агент SQL Server в MSSQL - выполнить sproc так часто.
Я бы использовал cron
(linux) или Windows Task Scheduler
(окна), чтобы запланировать его выполнение каждую минуту, и ваша хранимая процедура выполнит свою задачу, а затем выйдите.
Сохранение procs run "forever" - действительно плохая идея. У вас есть давние соединения (которые могут умереть), вы можете случайно заблокировать стол (навсегда) и т.д.
Поскольку они не имеют ничего общего друг с другом, разделение "цикла" с вашей "задачей" является хорошим дизайном, а это означает, что вы можете использовать (разные) инструменты, наиболее подходящие для каждой части.