2012-06-13 1 views
1

Я разрабатываю приложение на основе Java EE, используя Tomcat в качестве сервера и MySQL как базу данных. Я настроил пул соединений для 50 пользователей.Java EE: когда пользователи превышают число, заданное в соединении Пул

Теперь мой вопрос: если в данный момент есть 51 пользователь, обращающийся к приложению (одновременно), что произойдет с 51-м пользователем? (так как приложение поддерживает только 50 подключений одновременно)

Мое требование состоит в том, что для 51-го пользователя мне нужно показать сообщение типа « ». Пожалуйста, обратитесь через некоторое время ».

Возможно ли это?

ответ

6

Пул соединений 50 означает, что у вас будет максимум 50 соединений с вашим WebApp на вашу БД, это не означает максимальное количество пользователей, которые могут одновременно подключаться к вашему приложению.

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

Вы не указали, какой пул подключений вы используете, но я предполагаю, что вы используете какую-либо приличную библиотеку и используете ее соответствующим образом, например, вызываете connect.close() каждый раз, когда вы закончите свой запрос, чтобы вернуть соединение с пулом ,

Если это так, то не беспокойтесь, если весь пул будет использован, следующий пользователь будет просто поставлен в очередь до тех пор, пока в пул не будет возвращено одно соединение.

Таким образом, вы можете добавить тайм-аут, чтобы обнаружить это время очереди, например, если через 5-10 секунд DriverManager.getConnection() не возвращается, предположим, что пул заполнен и перенаправляет пользователя на статическую страницу с этим сообщением.

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

+0

Спасибо, Эван, ваш ответ выглядит интересным: «вы можете добавить тайм-аут, чтобы обнаружить это время очереди, например, если через 5-10 секунд DriverManager.getConnection() не возвращает перенаправление на статическую страницу. Не могли бы вы рассказать мне, как добавьте тайм-аут? – Pawan

+0

это зависит от того, какой пул соединений вы используете? Apache DBCP? – Evan

+0

Я мог бы упростить это. См. это [ответ] (http://stackoverflow.com/questions/1164301/how-do-i-call -some-blocking-method-with-a-timeout-in-java) как использовать исполнитель для добавления тайм-аута для метода блокировки. – Evan

1

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

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

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

+0

Спасибо за комментарии, я уверен, что правильно управляю соединениями (Taht получает их внутри самого слоя DAO), хорошо, я понял, что пользователь 51 помещен в очередь, так как я могу показать пользователю сообщение если нет ответа на 3 сек? Должно ли это управляться в Javascript ?? – Pawan

+0

Неправильно. DAO не должны управлять соединениями. Это работа службы. В Интернете вполне возможно подождать дольше 3 секунд. Если время соединения заканчивается, отключите исключение и сообщите его, как вы хотите, пользователю. Должен * не * быть JavaScript. – duffymo

2

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

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

Что касается вашего вопроса? Tomcat ставит 51-й запрос на соединение в очереди, и как только один из них доступен, происходит фактическое соединение.

0

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

Однако некоторые реализации пула соединений также позволяют изменять размер соединительного пула в разное время при различной нагрузке в приложении.

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