并发访问Java servlet服务方法

时间:2009-09-21 17:29:06

标签: java servlets

背景:我正在使用hibernate对象进行数据库访问 在我的servlet里面,我有:

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

由于servlet允许并发访问,所以accountBalance有时会搞砸。我有几个问题:

  1. 这里的最佳做法是什么?我的线程应该实现SingleThreadModel以防止并发访问吗?或者同步doGet中的所有内容?
  2. 我应该做以下事情吗?在休眠中做什么是正确的?

    Account account=getUserAccountHibernateObject();
    doWorkOnAccount(account);
    account=getUserAccountHibernateObject();
    decreaseAccountBalanceAndSaveToDB(account); //also synchronize this method.
    
  3. 编辑: 暂定解决方案: 感谢答案提供的链接,我想我需要在整个servlet请求中跨越DB事务:

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

    如果有任何hibernate / db guru,那就有问题了,请告诉我。

2 个答案:

答案 0 :(得分:3)

您想使用交易。有一个section of the Hibernate manual涵盖了这一点,尤其是“工作单元”部分。

答案 1 :(得分:0)

我的猜测是你的部分代码存储或访问静态变量中的数据,或者是不正确的线程安全。

我曾经研究过相对较大的Web应用程序,它们从不需要提供过多的同步(当然也不需要单线程访问)以避免并发问题。

如果没有详细说明事情的布局,很难说出具体的解决方法。