Java. работа с БД из сервлета

💡 Усі статті, обговорення, новини про Java — в одному місці. Приєднуйтесь до Java спільноти!

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

создаем подключение—> подключаемся к БД—> формируем запрос—> отправляем запрос к БД—> Получаем результаты запроса—> Обрабатываем их—> Закрываем соединение—> Ок.

Теперь, немного вникнув в практическую часть, понял, что так вообще никто не делает, а все происходит через пул соединений, то есть по следующему алгоритму:

инициализация сервлета—> создаем пул соединений—> запрос от пользователя—> берем из пула свободное соединение—> формируем запрос—> отправляем запрос к БД—> Получаем результаты запроса—> Обрабатываем их—> возвращаем соединение обратно в пул—> ok.

Теперь у меня есть такая задача:

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

как же мне в такой ситуации реализовывать пул? Если я правильно понимаю, то пул — это ничто иное, как просто группа однотипных подключений с одним логином и паролем. А у меня тут 10 пар логин/пароль. Получается, что пул в моем случае нужно отбрасывать? Тогда что мне делать?

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Еще вариант коннектится к базе через пул на правах суперюзеря и ограничения разлуливать на уровне приложения.

А что использовать DataSource для доступа к jdbc уже не модно? Или мы опять возвращаемся в каменный век?

позволяет:)), но вот только у меня сейчас нету списка логин/пароль. Только тестовый доступ, подключаюсь вот так:

conn =
DriverManager.getConnection("jdbc:oracle:thin:@",request.getParameter("user_login"),request.getParameter("user_password"));

ну та все это будет потом, eugene_n, Спасибо большое Вам за помощь.

Ну типа того. А что сделать массив из 30 элементов и поиск по нему религия не позволяет?

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


во время обработки запроса от первого пользователя, к сервлету поступает запрос от пользователя № 2. Как поступит в этом случае сервлет?

Гугл рулит:

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

А каждый следующий запрос будет выбирать из пула следующее соединение.

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

— то есть при инициализации сервлета создавать вместо одного пула — 10 пулов, так?
я вот сейчас прикинул — общее количество пользователей+количество работающих пользователей в момент времени+вычислительная мощь сервера БД и вы знаете, можно и пренебречь затратами на установку подключения, ну как минимум на первых порах.
Но теперь у меня возникает второй вопрос, конечно он довольно простой и мне даже как то стыдно его задавать, но:
как разрулится следующая ситуация:
в 1ю секунду времени, приходит к сервлету запрос от пользователя № 1, сервлет при обработке запроса начинает выполнять 1й алгоритм:
создаем подключение—> подключаемся к БД—> формируем запрос—> отправляем запрос к БД—...
во время обработки запроса от первого пользователя, к сервлету поступает запрос от пользователя № 2. Как поступит в этом случае сервлет?
Он бросит пользователя № 1 и начнет выполнять запрос № 2?

Он отбросит запрос № 2 так как сейчас занят № 1?... или же вообще Exception?

Фабрика (Abstract factory), которая возвращает один из 10 connection pool.

А причем тут абстрактная фабрика? Тут же не надо создавать разнородные классы.

А у меня тут 10 пар логин/пароль. Получается, что пул в моем случае нужно отбрасывать? Тогда что мне делать?

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

не, это не я так все организовал — изначально есть уже используемая БД, со своей иерархией пользователей, конечно же там не 10 групп — может меньше, а пользователей не 100, а может и больше, я округлил слегка, так вот мне просто необходимо реализовать работу с ней.


все они разбиты на 10 групп, у каждой группы свой логин и пароль для подключения к БД.
Первое что пришло в голову:
Фабрика (Factory method), которая возвращает один из 10 connection pool.

P.S. Если вы решили таким образом организовать роботу с правами пользователей приложения, то есть вынеся ее в БД, то это плохая идея.

Підписатись на коментарі