Java: сделать что-то на событие в базе данных SQL? - PullRequest
2 голосов
/ 16 июня 2010

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

Теперь я хочу вызвать событие действия в считывателе и перезагружать информацию из БД всякий раз, когда я вставляю что-то из устройства записи.

Есть ли простой способ по этому поводу?

Это было бы хорошей идеей? :

// READER
while(true) {
    connect();

    // reload info from DB
    executeQuery("select * from foo");

    disconnect();
}

РЕДАКТИРОВАТЬ: Подробнее

Это система кассовых терминалов ресторана.

Всякий раз, когда кассир вводит заказ в БД - приложение на кухне получает уведомление. Такую систему вы бы видели в McDonald's.

Приложения не должны быть связаны каким-либо образом. Но каждая часть будет подключаться к одному серверу mySQL.

И я полагаю, что ожидал немедленных уведомлений.

Ответы [ 5 ]

4 голосов
/ 16 июня 2010

Вы можете подумать о настройке встроенного JMS-сервера в своем приложении, я бы порекомендовал ActiveMQ, поскольку его очень просто внедрить.

Для того, что вы хотите сделать, тема JMS идеально подходит. Когда кассир пробивает заказ, заказ записывается не в базу данных, а в сообщении в теме, назовем его newOrders.

На тему есть 2 подписчика: NewOrderPersister и KitchenNotifier. Каждый из них будет иметь метод onMessage (Message msg), который содержит детали заказа. Один сохраняет его в базе данных, другой добавляет его на экран или выкрикивает через кухню с текстом в речь, что угодно.

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

2 голосов
/ 16 июня 2010

Идея, о которой вы говорите, называется "опрос".Как указал Graphain, вы должны добавить задержку в цикл.Величина задержки должна определяться исходя из таких факторов, как то, как быстро вы хотите, чтобы ваш читатель обнаружил любые изменения в базе данных, и как быстро писатель должен вставить / обновить данные.

Следующим усовершенствованием вашего решения может быть наличие индикатора изменений в базе данных.Ваш алгоритм будет выглядеть примерно так:

// READER
while(true) {
    connect();

    // reload info from DB
    change_count=executeQuery("select change_count from change_counters where counter=foo");
    if(change_count> last_change_count){
      last_change_count=change_count;
      reload();
    }

    disconnect();
}

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

1 голос
/ 16 июня 2010

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

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

Если вы действительно хотите использовать базу данных для синхронизации, вам следует изучить триггеры и хранимые процедуры. Я вполне уверен, что большинство СУБД позволяют создавать хранимые процедуры на Java или C, которые могут выполнять произвольные действия, такие как открытие Socket и связь с другим компьютером. Хотя это возможно и не так плохо, как опрос, я все равно не считаю это очень хорошей идеей.

0 голосов
/ 16 июня 2010

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

0 голосов
/ 16 июня 2010

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

В какой среде приложения работают?Говорим ли мы об одном и том же машинном уведомлении, кросс-сетевом, по сети?

Как часто происходят обновления и как скоро о них должен знать читатель?

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