Планирование работы базы данных - PullRequest
2 голосов
/ 18 декабря 2009

У меня есть процедура, написанная на PLJava, которая отправляет обновления через JMS в мою базу данных postgres.

Я хотел бы, чтобы эта функция вызывалась внутри интервала (каждые 15 секунд) в базе данных (предпочтительно не из внешнего процесса). Это возможно? Есть идеи?

Ответы [ 7 ]

2 голосов
/ 09 января 2010

Во-первых, вы потратите наименьшее количество усилий, если просто займётесь работой cron.

Однако, если вы начинаете с scracth: вы пытаетесь периодически реплицировать строки из вашей базы данных. Я думаю, что вы смотрите на очередь репликации.

Проект PGQ (используется для репликации Londiste, оба из SkypeTools Skype) имеет очередь, которую вы можете использовать независимо. Когда настраивает его , вы устанавливаете максимальное количество событий и задержку цикла перед генерацией пакетных событий. Таким образом, вы можете получать партии с интервалом не более 15 секунд. Теперь вам нужно создать события, которые будут упакованы, используя триггер, который вызывает pgq.insert_event ; и потреблять очереди. Потребитель может вызвать ваш хранимый процесс PL / Java; вам придется переписать процедуру, чтобы отправить все в пакете, а не сканировать базовую таблицу на наличие новых событий.

2 голосов
/ 05 января 2010

Если вам не нужен внешний доступ, вы, вероятно, можете изменить структуру базы данных, чтобы вам вообще не требовалось обновление. Можете ли вы объяснить больше о том, что делает обновление?

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

2 голосов
/ 18 декабря 2009

Строгий ответ: это невозможно. Поскольку вам не нужны внешние процессы, а PostgreSQL не поддерживает задания - вам не повезло.

Если вы пересмотрите использование внешних процессов, то вам, скорее всего, понадобится что-то вроде cron или, что еще лучше, pgagent.

С другой стороны - что нужно делать, чтобы это происходило каждые 30 секунд? это похоже на проблему с дизайном.

1 голос
/ 18 декабря 2009

Насколько я знаю, postgresql не поддерживает запланированные задачи. Вам нужно будет использовать скрипт с cron или at (в зависимости от вашей операционной системы.)

0 голосов
/ 12 января 2010

Согласно вашему комментарию depesz , у вас есть хранимая процедура PL / Java, которая "очищает таблицы базы данных (обновления) как объекты Java". Поскольку вы хотите, чтобы он запускался с интервалом в 15 секунд, он должен каждый раз обрабатывать пакет обновлений. Вместо того, чтобы обрабатывать пакет обновлений в хранимой процедуре каждые 15 секунд, почему бы не обработать их по одному, когда они происходят через триггер после обновления, и устранить необходимость во временном интервале. Если вы собираете данные из нескольких таблиц для создания своих объектов, добавьте триггеры только в самые верхние таблицы.

0 голосов
/ 11 января 2010

Если вы используете JMS, почему бы просто не дождаться ввода данных в очередь?

0 голосов
/ 08 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...