Справочная информация. Я использую объекты hibernate для доступа к базе данных.
внутри doGet моего сервлета у меня есть:Параллельный доступ к методу службы сервлетов Java
Account account=getUserAccountHibernateObject();
doWorkOnAccount(account);
decreaseAccountBalanceAndSaveToDB(account);
Поскольку сервлет позволяет одновременный доступ, то AccountBalance действительно перепутались иногда. У меня есть несколько вопросов:
- Какая у нас лучшая практика? Должен ли мой поток реализовать SingleThreadModel для предотвращения параллельного доступа? Или синхронизировать все в doGet?
Должен ли я сделать следующее? Что делать в спящем?
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 там есть что-то не так с этим, пожалуйста, дайте мне знать.
Сервлет может использоваться одновременно, но не является его служебным() локальным переменным. Таким образом, параллелизм сервлетов здесь не проблема. Я подозреваю, что ваша проблема связана с отсутствием транзакций БД или неправильной блокировкой объектов. –