Веб-приложение Java для нескольких пользователей

#concurrency #web

#параллелизм #веб

Вопрос:

Мне нужно разработать и реализовать веб-приложение Java, которое может использоваться несколькими пользователями одновременно. Объем данных, обрабатываемых этим приложением, будет огромным, и для отображения результатов (записей базы данных) на странице может потребоваться около 5 минут.

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

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

Любая информация по этому поводу была бы высоко оценена.

Спасибо.

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

1. : Не могли бы вы немного подробнее рассказать о проблеме

2. Какая база данных и абстракция базы данных (спящий режим?) вы используете, какой фреймворк (struts?) и какой сервер приложений (tomcat / jboss / jetty) вы используете? Пожалуйста, покажите нам ошибки, которые показывает сервер приложений.

3. Я не использовал никаких фреймворков. Страница jsp будет направлена на сервлет, который будет выполнять бизнес-логику и перенаправлять на другую страницу jsp. Теперь бизнес-логика присутствует внутри другого класса Java. Для получения записей я не обращаюсь к базе данных напрямую. Я просто выполняю вызовы HttpURLConnection (post) для получения данных. Этот запрос отправляется на сервер для извлечения данных.

Ответ №1:

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

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

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

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

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

1. Я не использовал никаких фреймворков. Страница jsp будет направлена на сервлет, который будет выполнять бизнес-логику и перенаправлять на другую страницу jsp. Теперь бизнес-логика присутствует внутри другого класса Java. Для получения записей я не обращаюсь к базе данных напрямую. Я просто выполняю вызовы HttpURLConnection (post) для получения данных. Этот запрос отправляется на сервер для извлечения данных.

2. @ITAmateur: Все это может быть сделано неправильно (в основном с использованием статических полей), но если все сделано правильно, это не должно вызывать проблем с параллелизмом. По-прежнему отсутствует самая важная информация: в чем именно заключается ошибка, которую вы видите? Кроме того, как обрабатываются те HTTP-сообщения, которые создает ваш код? И что является базовой базой данных?

Ответ №2:

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

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

Одновременная обработка нескольких запросов — это работа с контейнером, и как разработчик приложения мы должны сосредоточиться на том, как мы обрабатываем те запросы, которые пересылаются контейнером.

Я должен предложить вам получить некоторое представление о том, как работает веб-приложение и как происходит цикл запрос -ответ

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

1. Я не использовал никаких фреймворков. Страница jsp будет направлена на сервлет, который будет выполнять бизнес-логику и перенаправлять на другую страницу jsp. Теперь бизнес-логика присутствует внутри другого класса Java. Для получения записей я не обращаюсь к базе данных напрямую. Я просто выполняю вызовы HttpURLConnection (post) для получения данных. Этот запрос отправляется на сервер для извлечения данных.

2. @ITAmateur Вы делаете это просто для того, чтобы узнать, как работает flow, или вы планируете использовать это в производстве, поскольку я не могу представить такой дизайн для работы в приложении реального времени. Все, что вам нужно сделать, это написать обработчик запросов / ответов контроллера и другие процессоры.

3. Я уже реализовал это таким образом, и это работало нормально, пока один пользователь пытался получить результаты. Проблема возникла, когда два человека попытались одновременно запустить приложение. Это приложение уже развернуто на производственной площадке. Но я сталкиваюсь с этой одновременной многопользовательской проблемой. Может быть, это потому, что я не использовал какие-либо фреймворки, такие как Struts, или это может быть проблема метода HttpURLConnection (post), который не может отправить два запроса post одновременно? Каков был бы идеальный способ разработки веб-приложения, поддерживающего многопользовательский режим?

4. @ITAmateur также просто посмотрите на сторону DB, все ли работает нормально, как предлагает Майкл Боргвардт в своем ответе