2012-05-12 3 views
7

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

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

Дон

+0

Нет ли планирование объекта в базе данных? Даже у MySQL есть один. – EJP

+0

Я не знаю .. есть? Я не уверен, насколько легко было бы реализовать функцию sleep() внутри базы данных. На самом деле, думая об этом, было бы чрезвычайно сложно. –

+0

http://dev.mysql.com/doc/refman/5.1/en/events.html – goat

ответ

0

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

+0

Вопрос с меткой mysql ... – eggyal

+0

База данных - это mysql. yes - У меня был бы внешний процесс, запускающий это каждый так часто, если в DB нет способа сделать это. –

0

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

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

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

14

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

SELECT SLEEP(<seconds>); 

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

SELECT SLEEP(0.2); 

было бы в порядке.

+2

Кроме того, если вам не нужны результаты запроса (которого вы, вероятно, нет, поскольку select sleep() просто приносит 0), вы можете использовать «DO SLEEP ();» – Diego

+0

Это не сработало для меня. Я использую Oracle 11g. – sebadagostino

Смежные вопросы