Опрос базы данных против запуска программы из базы данных? - PullRequest
7 голосов
/ 15 марта 2012

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

Таким образом, программа должна быть проинформирована о том, когда данные доступны в базе данных дляэто обрабатывать.Я мог бы либо

  1. заставить программу опрашивать базу данных, либо
  2. заставить базу данных вызвать программу.

ВОПРОС 1: Есть ли общепринятое мнение, почему один подход может быть лучше другого?

ВОПРОС 2: Интересно, есть ли у программ какие-либо проблемы, «работающие» по несколько месяцев за один раз (не остановятся ли какие-либо процессы на сервере или не прервется ли выполнение программы?узнал, что была проблема, если только от злых клиентов).У кого-нибудь есть опыт запуска программ на сервере в течение длительного времени без проблем?Или, если сервер аварийно завершает работу, есть ли способ автоматически запустить на нем программу (то есть исполняемый язык C) после перезагрузки сервера, не требуя, чтобы человек запускал ее специально?

Любой совет приветствуется.

ОБНОВЛЕНИЕ 1: клиент ожидает результатов, но дополнительная задержка в пару секунд (с момента опроса) не нарушает условия сделки.

Ответы [ 5 ]

2 голосов
/ 15 марта 2012

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

Классический (и наиболее удобный IMO) способ сделать это в Oracle - использовать пакет DBMS_ALERT .

Первая программа выдаст сигналоповещение с определенным именем, передавая необязательное сообщение.Вторая программа, которая зарегистрировалась для оповещения, будет ждать и получать его сразу после фиксации первой программы.Откат первой программы приведет к отмене оповещения.

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

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

2) автозапуск или фоновое выполнение зависит от вашей хост-платформы и ОС.В Windows вы можете использовать SRVANY.EXE для запуска любого исполняемого файла в качестве службы.

1 голос
/ 15 марта 2012

Возможно, вы захотите заглянуть в «Уведомление об изменениях» Oracle:

http://docs.oracle.com/cd/E11882_01/appdev.112/e25518/adfns_cqn.htm

Я не знаю, насколько хорошо это интегрируется с "обычной" программой на Си.

Он также доступен через .Net и Java / JDBC

http://docs.oracle.com/cd/E11882_01/win.112/e23174/featChange.htm
http://docs.oracle.com/cd/E11882_01/java.112/e16548/dbchgnf.htm

1 голос
/ 15 марта 2012

Я рекомендую использовать программу на C для опроса базы данных и такую ​​утилиту, как monit , чтобы перезапустить программу на C, если возникнут какие-либо проблемы. Ваша C-программа может время от времени касаться файла, чтобы указать, что он все еще работает должным образом, и monit может отслеживать файл. Monit также может напрямую проверить процесс и убедиться, что он не использует слишком много памяти.

Для получения дополнительной информации вы можете увидеть мой ответ на этот другой вопрос:

Когда добавляется новая строка в базе данных, должна вызываться внешняя программа командной строки

В качестве альтернативы, если люди не сидят в ожидании завершения вычислений, вы можете использовать задание cron для регулярного запуска программы на C (например, каждую минуту). Тогда monit будет менее необходим, потому что ваша C-программа будет запускаться и останавливаться все время.

0 голосов
/ 16 августа 2012

Я хотел бы дать более общий ответ ...

Не существует правильного ответа, который применим каждый раз.Иногда вам нужен триггер, а иногда лучше опросить.

Но ... 9 из 10 раз опрос намного эффективнее, безопаснее и быстрее , чем триггер.

Это действительно просто.Триггер должен создавать отдельную программу любой природы для каждого выстрела.Это просто не эффективно в большинстве случаев.Некоторые люди утверждают, что это требуется, когда время ответа является фактором, но даже в этом случае опрос в половине раз лучше, потому что:

1) Ресурсы: с триггерами, скажем, 100 сообщений, вам потребуются ресурсыдля 100 потоков с 1 потоком, обрабатывающим пакет из 100 сообщений, вам необходимы ресурсы для 1 программы.

2) Мониторинг: пакеты обработки потоков могут сообщать о времени, потребляемом постоянно при определенном размере пакета, четко указывая, как онопроизводительность и когда и как это влияет на производительность.Попробуйте это с миллиардом триггеров, прыгающих вокруг ...

3) Скорость: создание потоков и распределение их ресурсов очень дорого.И не заводите меня, если вы открываете транзакцию для каждого триггера.Простая программа, обрабатывающая, скажем, 100 сообщений, всегда будет намного быстрее, чем инициализация 100 триггеров ...

3) Время реакции: с опросом вы не можете реагировать на события в сети.Таким образом, единственное исключение, разрешенное для использования опроса, - это когда пользователь ожидает обработки сообщения.Но тогда вам нужно быть очень осторожным, потому что если у вас много клиентов, которые делают одно и то же одновременно, запуск может дать ответ ПОЗЖЕ, чем если бы вы выполняли быстрый опрос.

My 2cts.Это было изучено трудным путем ..

0 голосов
/ 15 марта 2012

Существуют простые менеджеры заданий, такие как gearman , которые можно использовать для отправки сообщения о задании из базы данных работнику.Gearman имеет, помимо прочего, пользовательский интерфейс функций MySQL, так что, вероятно, его легко создать для oracle.

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