powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Java [игнор отключен] [закрыт для гостей] / Потокобезопасность в веб-сервисах при работе с БД.
15 сообщений из 15, страница 1 из 1
Потокобезопасность в веб-сервисах при работе с БД.
    #39839550
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос тупой, ибо это основы скорее всего, но прошу сильно не пинать.

Есть веб-сервис.
К нему приходит запрос, по которому надо залезть в БД и что-то там сделать (пока не важно что).
Коннект к БД идет через JNDI через настроенный пул подключений веб-сервера.
То есть, понятно, что получили коннект, при закрытии, соединение вернулось в пул, все ок, все работает.
Все, что относится к работе с БД сидит в отдельном классе (без Spring-а).

Теперь ситуация. Пока обрабатывается один запрос БД, в сервис приходит новый запрос.
Вопрос в том, надо ли создавать каждый раз новый экземпляр класса, из которого идет обращение к БД?
Сам считаю, что надо, ибо пул коннектов - это одно и сессии пересекаться не должны, но сам класс - это другое и тут могут быть накладки, но мне это кажется не рациональным каждый раз создавать новый экземпляр класса который запрашивает БД, понятно, что на современных мощностях - это ничто, но тем не менее, имхо должен быть более разумный вариант )
Например сделать пул экземпляров класса для работы с БД Но это громоздко.
Но когда в приложении кучка сервисов и по ходу идет куча обращений к БД из разных мест кода, а еще на сервере куча таких приложений, то создавать на каждый возов экземпляр класса не нормально по-моему.
?
...
Рейтинг: 0 / 0
Потокобезопасность в веб-сервисах при работе с БД.
    #39839553
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется в виду в частности на каждый вызов веб-сервиса, внутри вызова понятно, что может быть несколько обращений к БД и все они могут использовать один экземпляр класса работы с БД, созданный в самом начале при входе в обработчик сервиса.
Но может есть правильные варианты? )
...
Рейтинг: 0 / 0
Потокобезопасность в веб-сервисах при работе с БД.
    #39839554
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDSНо когда в приложении кучка сервисов и по ходу идет куча обращений к БД из разных мест кода, а еще на сервере куча таких приложений, то создавать на каждый возов экземпляр класса не нормально по-моему.
?
Все современные БД - потокобезопасны. Можешь спокойно работать и не думать о синхронизации.
Синхронизация должна быть только во внутренней логике твоего приложения чтобы не допускать
ситуации гонок или мертвых блокировок.

Объект Connection - спокойно бери из пула каждый раз когда есть необходимость. This is good way.
В конце объекту надо сказать close() или обернуьт его try-with-resources чтоб гарантировано вернуть его
обратно в пул.
...
Рейтинг: 0 / 0
Потокобезопасность в веб-сервисах при работе с БД.
    #39839556
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, что касается самой БД, с этим все понятно и с пулом понятно.
Вопрос именно в классе, из которого идет обращение к БД.

Например (схематично):
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
class MyWebService {
   private DBProcess dbProcess = null;

   // обработчик вызова сервиса
   public void webServProc() {
       dbProcess = new dbProcess();  // вопрос нормально ли все время создавать новый, может есть более норм решения?
       dbProcess.process();
   }
}


class DBProcess {
     private Connection con = null;

     public DPProcess() {         
     }

     public void process() {
          // получили коннект из пула
           // поделали в БД что надо
            // вернули коннект
     }  
}
...
Рейтинг: 0 / 0
Потокобезопасность в веб-сервисах при работе с БД.
    #39839559
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В коде не видно мотивации к тому чтобы делать dbProcess свойством класса.

Можно спокойно сделать переменной и логика не изменится. Более того. Этот код будет более изолирован и
как следствие безопасен.

Код: java
1.
2.
3.
4.
5.
6.
7.
class MyWebService {
   // обработчик вызова сервиса
   public void webServProc() {
       DBProcess dbProcess = new dbProcess();  // вопрос нормально ли все время создавать новый, может есть более норм решения?
       dbProcess.process();
   }
}
...
Рейтинг: 0 / 0
Потокобезопасность в веб-сервисах при работе с БД.
    #39839563
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDSВопрос именно в классе, из которого идет обращение к БД.этот не нужен вообще. Попробуй.
Я делал коннект прямо в сервлете первой строкой в doGet
...
Рейтинг: 0 / 0
Потокобезопасность в веб-сервисах при работе с БД.
    #39839564
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDSпул коннектов - это одно и сессии пересекаться не должныесть 5 видов сессий. Ты про какую?
Есть хибер сессия. Есть id session IE, есть бд сессия....
...
Рейтинг: 0 / 0
Потокобезопасность в веб-сервисах при работе с БД.
    #39839565
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, согласен, с переменной выглядит лучше, спасибо.
PetroNotC Sharp, согласен, можно и сразу, но там просто общие процедуры, которые вызываются из разных мест, те чтобы не дублировать. Насчет сессий, про сессии - про коннекты пула веб-сервера, ни хибернейтов, ничего такого нет.
...
Рейтинг: 0 / 0
Потокобезопасность в веб-сервисах при работе с БД.
    #39839570
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS,
Если ничего нет, то контейнер сам создаст поток и пул все разрулит. Коннект будет внутри потока. А не один коннект на два потока.
То есть не думать ни о чем и исключить из вопроса топика слово потоки. Делать классы как обычно в ЯП.
...
Рейтинг: 0 / 0
Потокобезопасность в веб-сервисах при работе с БД.
    #39839572
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS
Код: java
1.
class MyWebService

кто и как создает?
...
Рейтинг: 0 / 0
Потокобезопасность в веб-сервисах при работе с БД.
    #39839574
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDSпросто общие процедуры, которые вызываются из разных мест,тогда название делай так чтобы понятно что они делают. А не безликое МояПроцедураНаСервереВебовская(
...
Рейтинг: 0 / 0
Потокобезопасность в веб-сервисах при работе с БД.
    #39839576
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp, это все понятно, что из пула достается свободный коннект и все разруливается.
Понятно и то, что контейнер создает новый поток при вызове сервиса (во всяком случае должен бы )).
Вопрос был ровно про обращение к другому классу и по комментарию myton-а понял, что лучше просто через переменную, в остальном пока видимо да PetroNotC SharpДелать классы как обычно в ЯП.
...
Рейтинг: 0 / 0
Потокобезопасность в веб-сервисах при работе с БД.
    #39839579
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDSчто лучше просто через переменную,
и класс сервис сделать статик. Экземпляр не нужен так состояния нету.
...
Рейтинг: 0 / 0
Потокобезопасность в веб-сервисах при работе с БД.
    #39839591
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDSНо может есть правильные варианты? )
либо твой класс потокобезопасен и тогда можно использовать один экземпляр, либо нет - и тогда нужно либо создавать копии, либо сделать его потокобезопасным. Оба варианта имеют право на жизнь в зависимости от обстоятельств.
...
Рейтинг: 0 / 0
Потокобезопасность в веб-сервисах при работе с БД.
    #39839668
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaJDSНо может есть правильные варианты? )
либо твой класс потокобезопасен и тогда можно использовать один экземпляр, либо нет - и тогда нужно либо создавать копии, либо сделать его потокобезопасным. Оба варианта имеют право на жизнь в зависимости от обстоятельств.
Правильный ответ, только вряд-ли ТС в курсе что значит потокобезопасность.

Если у тебя нет стейта в классе(изменяемых переменных, которые зависят от некой логики), то твой класс потокобезопасен, можешь сделать статиком или синглтоном. Если изменеямое состояние есть - там надо выкручиваться, но это уже широкий топик.
Про пул объектов как оптимизацию забудь в принципе, это ничего не дает и только напрягает GC. Пулы надо делать для ресурсов, создание которых дорогостоящее, например коннекшен к базе.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Потокобезопасность в веб-сервисах при работе с БД.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]