Два разных Java-приложения совместно используют одну и ту же базу данных

#java #hibernate #integration

#java #переход в спящий режим #интеграция

Вопрос:

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

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

Мой стек приложений — это Tapestry (веб-уровень), Spring, Hibernate (поверх MySQL) и моя собственная реализация сканера, независимая от других.

Хорошо ли, чтобы интеграция выполнялась только с использованием одной и той же базы данных? Это может вызвать проблему с доступом к базе данных из обоих приложений одновременно. Или интеграция может быть выполнена на уровне гибернации, чтобы оба приложения могли использовать один и тот же сеанс гибернации? Но может ли приложение из одного экземпляра JVM получить доступ к объекту из другого экземпляра JVM?

Я был бы признателен за любые предложения по этому вопросу.

Обновить

Пользователь (из интерфейса веб-приложения) вводил URL-адреса для анализа сканером. Приложение-поисковик просто прочитает таблицы с URL-адресами, которые заполняет веб-приложение. И наоборот, данные, обработанные сканером, будут просто представлены в пользовательском интерфейсе. Итак, я думаю, мне не стоит беспокоиться о какой-либо блокировке, верно?

Спасибо, Никола

Ответ №1:

Я бы определенно разделил их, как вы планируете. Сканирование веб-страниц — это скорее «пакетный» процесс, чем веб-приложение, управляемое запросами. Приложение для обхода веб-страниц будет запускаться в своей собственной JVM, а ваше веб-приложение будет запущено в контейнере servlet / Java EE.

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

Будут ли пользователи из Web app обновлять те же таблицы, в которые сканер будет отправлять данные? В этом случае вам нужно будет принять меры предосторожности, иначе может возникнуть потенциальная взаимоблокировка. Если вы хотите, чтобы ваше веб-приложение автоматически обновляло данные на основе новых вставок в таблицы, вы можете создать компонент, управляемый сообщениями (используя JMS), для асинхронного уведомления веб-приложения из приложения-сканера. Когда приходит новое сообщение о вставке данных, вы можете либо отправить форму на своей странице, либо использовать ajax для обновления данных на самой странице.

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

Таким образом, вы получаете интеграцию между двумя приложениями, не замедляя при этом работу друг друга в ожидании обработки другого.

HTH!

Комментарии:

1. Большое спасибо за ваш ответ! Пользователь вставил бы URL-адреса страниц для обхода сканером, но приложение-сканер просто прочитало бы эту таблицу, не обновляя ее каким-либо образом. Спасибо!

Ответ №2:

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

Недостатки разделения на два приложения —

  • Вы не можете кэшировать в Hibernate или любых других кэшируемых изменяемых объектах, которые можно изменять из обоих приложений в любом из них. Оптимистичная блокировка должна нормально работать с двумя приложениями в режиме гибернации. Я не вижу никаких других проблем.

Преимущества, которые вы уже указали в своем коде.