Есть ли способ для SLEEP() в хранимой процедуре?

У меня есть хранимая процедура, которую я хотел бы запустить вечно, но спать в течение одной секунды в цикле. Когда он просыпается, он будет опросить таблицу, чтобы посмотреть, не должно ли она работать. Работу нужно выполнять каждую минуту, поэтому нет беспокойства о том, что стол для опроса попадает под обновления от двух авторов одновременно.

Каков наилучший способ SLEEP() для интервала в хранимой процедуре? Было бы неплохо, если бы он мог спать 200 миллисекунд, но одна секунда тоже работала бы.

Ответ 1

Я столкнулся с той же проблемой. После многого поиска я узнал, что мы можем использовать

SELECT SLEEP(<seconds>);

чтобы задержать наши процедуры за это много секунд. В вашем случае, используя

SELECT SLEEP(0.2);

будет просто отлично.

Ответ 3

У 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 (); 

Ответ 4

Вы не укажете, какую базу данных вы используете, но в целом способ добиться того, что вы хотите, - это не иметь бесконечно запущенного sproc, но иметь какой-то внешний компонент - например, планировщик или агент SQL Server в MSSQL - выполнить sproc так часто.

Ответ 5

Я бы использовал cron (linux) или Windows Task Scheduler (окна), чтобы запланировать его выполнение каждую минуту, и ваша хранимая процедура выполнит свою задачу, а затем выйдите.

Сохранение procs run "forever" - действительно плохая идея. У вас есть давние соединения (которые могут умереть), вы можете случайно заблокировать стол (навсегда) и т.д.

Поскольку они не имеют ничего общего друг с другом, разделение "цикла" с вашей "задачей" является хорошим дизайном, а это означает, что вы можете использовать (разные) инструменты, наиболее подходящие для каждой части.