2009-09-21 4 views
2

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

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: предварительное решение: благодаря ссылке, предоставленной ответы, я думаю, что мне нужно, чтобы охватить DB сделки в течение запроса сервлета:

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

, есть ли спящий режим/db guru там есть что-то не так с этим, пожалуйста, дайте мне знать.

+1

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

ответ

0

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

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

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

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