Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Потокобезопасность в веб-сервисах при работе с БД.  [new]
JDS
Member

Откуда:
Сообщений: 651
Вопрос тупой, ибо это основы скорее всего, но прошу сильно не пинать.

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

Теперь ситуация. Пока обрабатывается один запрос БД, в сервис приходит новый запрос.
Вопрос в том, надо ли создавать каждый раз новый экземпляр класса, из которого идет обращение к БД?
Сам считаю, что надо, ибо пул коннектов - это одно и сессии пересекаться не должны, но сам класс - это другое и тут могут быть накладки, но мне это кажется не рациональным каждый раз создавать новый экземпляр класса который запрашивает БД, понятно, что на современных мощностях - это ничто, но тем не менее, имхо должен быть более разумный вариант )
Например сделать пул экземпляров класса для работы с БД Но это громоздко.
Но когда в приложении кучка сервисов и по ходу идет куча обращений к БД из разных мест кода, а еще на сервере куча таких приложений, то создавать на каждый возов экземпляр класса не нормально по-моему.
?
20 июл 19, 10:45    [21930835]     Ответить | Цитировать Сообщить модератору
 Re: Потокобезопасность в веб-сервисах при работе с БД.  [new]
JDS
Member

Откуда:
Сообщений: 651
Имеется в виду в частности на каждый вызов веб-сервиса, внутри вызова понятно, что может быть несколько обращений к БД и все они могут использовать один экземпляр класса работы с БД, созданный в самом начале при входе в обработчик сервиса.
Но может есть правильные варианты? )
20 июл 19, 10:49    [21930838]     Ответить | Цитировать Сообщить модератору
 Re: Потокобезопасность в веб-сервисах при работе с БД.  [new]
mayton
Member

Откуда: loopback
Сообщений: 41377
JDS
Но когда в приложении кучка сервисов и по ходу идет куча обращений к БД из разных мест кода, а еще на сервере куча таких приложений, то создавать на каждый возов экземпляр класса не нормально по-моему.
?

Все современные БД - потокобезопасны. Можешь спокойно работать и не думать о синхронизации.
Синхронизация должна быть только во внутренней логике твоего приложения чтобы не допускать
ситуации гонок или мертвых блокировок.

Объект Connection - спокойно бери из пула каждый раз когда есть необходимость. This is good way.
В конце объекту надо сказать close() или обернуьт его try-with-resources чтоб гарантировано вернуть его
обратно в пул.
20 июл 19, 10:58    [21930840]     Ответить | Цитировать Сообщить модератору
 Re: Потокобезопасность в веб-сервисах при работе с БД.  [new]
JDS
Member

Откуда:
Сообщений: 651
mayton, что касается самой БД, с этим все понятно и с пулом понятно.
Вопрос именно в классе, из которого идет обращение к БД.

Например (схематично):
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() {
          // получили коннект из пула
           // поделали в БД что надо
            // вернули коннект
     }  
}
20 июл 19, 11:16    [21930842]     Ответить | Цитировать Сообщить модератору
 Re: Потокобезопасность в веб-сервисах при работе с БД.  [new]
mayton
Member

Откуда: loopback
Сообщений: 41377
В коде не видно мотивации к тому чтобы делать dbProcess свойством класса.

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

class MyWebService {
   // обработчик вызова сервиса
   public void webServProc() {
       DBProcess dbProcess = new dbProcess();  // вопрос нормально ли все время создавать новый, может есть более норм решения?
       dbProcess.process();
   }
}
20 июл 19, 12:07    [21930858]     Ответить | Цитировать Сообщить модератору
 Re: Потокобезопасность в веб-сервисах при работе с БД.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 1019
JDS
Вопрос именно в классе, из которого идет обращение к БД.
этот не нужен вообще. Попробуй.
Я делал коннект прямо в сервлете первой строкой в doGet
20 июл 19, 12:15    [21930865]     Ответить | Цитировать Сообщить модератору
 Re: Потокобезопасность в веб-сервисах при работе с БД.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 1019
JDS
пул коннектов - это одно и сессии пересекаться не должны
есть 5 видов сессий. Ты про какую?
Есть хибер сессия. Есть id session IE, есть бд сессия....
20 июл 19, 12:18    [21930869]     Ответить | Цитировать Сообщить модератору
 Re: Потокобезопасность в веб-сервисах при работе с БД.  [new]
JDS
Member

Откуда:
Сообщений: 651
mayton, согласен, с переменной выглядит лучше, спасибо.
PetroNotC Sharp, согласен, можно и сразу, но там просто общие процедуры, которые вызываются из разных мест, те чтобы не дублировать. Насчет сессий, про сессии - про коннекты пула веб-сервера, ни хибернейтов, ничего такого нет.
20 июл 19, 12:30    [21930872]     Ответить | Цитировать Сообщить модератору
 Re: Потокобезопасность в веб-сервисах при работе с БД.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 1019
JDS,
Если ничего нет, то контейнер сам создаст поток и пул все разрулит. Коннект будет внутри потока. А не один коннект на два потока.
То есть не думать ни о чем и исключить из вопроса топика слово потоки. Делать классы как обычно в ЯП.
20 июл 19, 12:40    [21930886]     Ответить | Цитировать Сообщить модератору
 Re: Потокобезопасность в веб-сервисах при работе с БД.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 1019
JDS
class MyWebService
кто и как создает?
20 июл 19, 12:42    [21930890]     Ответить | Цитировать Сообщить модератору
 Re: Потокобезопасность в веб-сервисах при работе с БД.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 1019
JDS
просто общие процедуры, которые вызываются из разных мест,
тогда название делай так чтобы понятно что они делают. А не безликое МояПроцедураНаСервереВебовская(
20 июл 19, 12:46    [21930892]     Ответить | Цитировать Сообщить модератору
 Re: Потокобезопасность в веб-сервисах при работе с БД.  [new]
JDS
Member

Откуда:
Сообщений: 651
PetroNotC Sharp, это все понятно, что из пула достается свободный коннект и все разруливается.
Понятно и то, что контейнер создает новый поток при вызове сервиса (во всяком случае должен бы )).
Вопрос был ровно про обращение к другому классу и по комментарию myton-а понял, что лучше просто через переменную, в остальном пока видимо да
PetroNotC Sharp
Делать классы как обычно в ЯП.
20 июл 19, 12:48    [21930895]     Ответить | Цитировать Сообщить модератору
 Re: Потокобезопасность в веб-сервисах при работе с БД.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 1019
JDS
что лучше просто через переменную,

и класс сервис сделать статик. Экземпляр не нужен так состояния нету.
20 июл 19, 12:57    [21930899]     Ответить | Цитировать Сообщить модератору
 Re: Потокобезопасность в веб-сервисах при работе с БД.  [new]
chpasha
Member

Откуда:
Сообщений: 8046
JDS
Но может есть правильные варианты? )

либо твой класс потокобезопасен и тогда можно использовать один экземпляр, либо нет - и тогда нужно либо создавать копии, либо сделать его потокобезопасным. Оба варианта имеют право на жизнь в зависимости от обстоятельств.
20 июл 19, 14:45    [21930930]     Ответить | Цитировать Сообщить модератору
 Re: Потокобезопасность в веб-сервисах при работе с БД.  [new]
забыл ник
Member

Откуда:
Сообщений: 2859
chpasha
JDS
Но может есть правильные варианты? )

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

Правильный ответ, только вряд-ли ТС в курсе что значит потокобезопасность.

Если у тебя нет стейта в классе(изменяемых переменных, которые зависят от некой логики), то твой класс потокобезопасен, можешь сделать статиком или синглтоном. Если изменеямое состояние есть - там надо выкручиваться, но это уже широкий топик.
Про пул объектов как оптимизацию забудь в принципе, это ничего не дает и только напрягает GC. Пулы надо делать для ресурсов, создание которых дорогостоящее, например коннекшен к базе.
21 июл 19, 11:49    [21931144]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить