Ограничение приложения Java/JSP определенным количеством спящих запросов

Мне нужна помощь в поиске эффективного решения для ограничения приложения Java/JSP, работающего на сервере tomcat, максимальным количеством одновременных запросов Oracle SQL в спящем режиме.

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

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

Спасибо.


person Tennison Dougherty    schedule 21.09.2015    source источник


Ответы (2)


Хранение в файле/базе данных не очень эффективно, оно может добавить к ответу небольшие накладные расходы. Вы должны сохранить значение в памяти. Вы можете сохранить только одну переменную в session scope пользователя (вы можете сохранить в application scope, если хотите ограничить уровень приложения). Таким образом, вам не нужно управлять общим хранилищем, таким как карта, где вы должны ссылаться с использованием идентификаторов пользователей (в случае ограничения на пользователя).

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

person Jos    schedule 21.09.2015
comment
Я использую Spring Framework. Доступны ли переменные области приложения и могут быть изменены всеми сеансами? Если один сеанс модифицирует его, то обновление доступно для всех остальных сеансов? - person Tennison Dougherty; 21.09.2015
comment
пожалуйста, проверьте эту ссылку. это объясняет два способа решить эту проблему. stackoverflow.com/questions/22574263/ . Кроме того, пожалуйста, примите ответ, если он помог. - person Jos; 22.09.2015

Вы используете пул соединений? Это позволит вам установить максимальное количество подключений, и обычно они предоставляют метод для запроса количества простаивающих подключений (которые вы можете использовать для своего предупреждения). См. DBCP Apache или c3p0.

person Brian Kent    schedule 21.09.2015
comment
Да, я использую один, но это не то решение, к которому я стремлюсь. Я хотел бы ограничить количество одновременных запросов для определенного запроса. - person Tennison Dougherty; 21.09.2015