2012-03-14 2 views
5

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

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

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

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

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

Любые советы, оцененные.

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

+1

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

+0

2) не имеет смысла. Нет такой вещи, как «программа С»; есть только программы. C - это язык, на котором вы можете создать программу, но после ее компиляции программа является программой. Если ваша ОС может запускать программы, тогда она также может запускать «C-программы», и если она сообщит вам, что она убьет их через 30 минут, тогда она убьет их независимо от того, написаны ли они на C или нет. Тем не менее, если вы напишете ужасный код, вы можете заставить программы умереть после того, как они запустили определенное время, потребляя слишком много ресурсов. –

+0

@ Kerrek только что отредактировал, чтобы удалить ссылку на C, так как вопрос на самом деле не зависит от языка. –

ответ

1

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

Классический (и наиболее удобный для ИМО) способ сделать это в Oracle будет через DBMS_ALERT package.

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

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

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

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

1

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

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

When a new row in database is added, an external command line program must be invoked

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

+0

Спасибо Дэвиду, в моем случае клиент ждет результатов. Ваша ссылка в основном указывает на то, что я пытаюсь сделать. Программа C будет обрабатывать первую строку, а затем удалять эту строку по завершении, делая предыдущую вторую строку теперь первой строкой, которую программа C будет обрабатывать и т. Д. Я собирался периодически обновлять какое-либо поле в базе данных (например, поле сердцебиения), чтобы показать, что он работает нормально, но использование внешнего файла также должно работать. – ggkmath

+0

Спасибо за ссылку monit. – ggkmath

+0

Да, файл хороший, потому что вам не нужно менять схему базы данных, и ее можно легко контролировать monit. –

0

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

0

Вы можете посмотреть в «Change Notification» в Oracle:

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

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

Он также доступен через.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

0

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

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

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

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

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

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

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

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

Мои 2cts. Это было усложнено.

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