Параллельный доступ к сервисному методу сервлета Java - PullRequest
2 голосов
/ 21 сентября 2009

Справочная информация: я использую объекты гибернации для доступа к базе данных.
внутри дела моего сервлета есть:

Account account=getUserAccountHibernateObject();
doWorkOnAccount(account);
decreaseAccountBalanceAndSaveToDB(account);

Так как сервлет допускает одновременный доступ, accountBalance иногда действительно портится. У меня есть несколько вопросов:

  1. Какая лучшая практика здесь? Должен ли мой поток реализовать SingleThreadModel для предотвращения одновременного доступа? Или синхронизировать все в doGet?
  2. Должен ли я сделать следующее? Что правильно делать в спящем режиме?

    Account account=getUserAccountHibernateObject();
    doWorkOnAccount(account);
    account=getUserAccountHibernateObject();
    decreaseAccountBalanceAndSaveToDB(account); //also synchronize this method.
    

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

beginTransaction();
try{
Account account=getUserAccountHibernateObject();
doWorkOnAccount(account);
decreaseAccountBalanceAndSaveToDB(account); 
commitTransaction();
}catch(Exception ep){
  rollBackTransaction();
}finally{
   closeSession();
}

если есть какой-нибудь hibernate / db-гуру, что-то там не так, пожалуйста, дайте мне знать.

Ответы [ 2 ]

3 голосов
/ 21 сентября 2009

Вы хотите использовать транзакции. Существует раздел руководства Hibernate , в котором описывается это, особенно часть "Единица работы".

0 голосов
/ 21 сентября 2009

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

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

Трудно предложить, что конкретно исправить, не видя больше того, как все устроено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...