java - session 如何使用 Spring MVC 和 hibernate 处理多个请求

标签 java spring hibernate spring-mvc spring-transactions

我有一个带有转账表的应用程序,用户可以在其中将钱从一个人转账到另一个人。我正在使用 spring MVC 和 hibernate 来创建 Web 服务。我了解到,当多个人通过同一个 Web 服务发送请求时,多个线程将由调度程序 servlet 创建。现在每个线程将执行 Controller 类中定义的各自的 Web 方法。现在我有一个 daoImplementation 类,我已将其与 Controller 类 Autowiring 。现在每个请求线程将使用 Autowiring 的 daoImplementation 对象来访问 daoImplementation 类方法。 现在我的第一个疑问是- 一个 daoImplementation 对象(其单例)如何处理多个请求?如果假设有数千人正在发送需要访问 daoImplementation 类方法的请求,每个请求需要 10 秒,那么第 1000 个请求的延迟将是 10000 秒。

现在,在该请求进入 daoImplementation 方法之后,它将执行数据库工作。在 daoImplementation 类中,我有 Autowiring 的 SessionFactory,它也是单例和线程安全的(这意味着对于每个请求,它将创建一个 session 线程)。在我的方法中,我正在创建 session 对象来执行我的交易。 现在我的第二个疑问是—— 假设有一千个人试图访问 daoImplementation 类中的相同方法,那么将创建 1000 个 session 对象。这一千个对象将如何与数据库交互,以便每个请求不会有太多延迟,以及数据库如何保持一致性? 而且 session 是线程安全的,它将如何影响我的系统。

现在我的第三个疑问- 对于转账,首先我需要获取发送者帐户中存在的当前金额,然后检查它是否小于他想要转移到接收者帐户的金额,然后从发送者帐户中扣除该金额,然后在接收者帐户中添加该金额帐户,然后关闭 session 。作为初学者,我将像这样编写代码-

    public class CommonDAOImpl{
    private SessionFactory sessionFactoryCommon;
    public void setSessionFactoryCommon(SessionFactory sessionFactoryCommon) {
        this.sessionFactoryCommon = sessionFactoryCommon;
        System.out.println("SessionFactory is set");
    }
    public void addMoney(String userId,double amount) {
        Session session = this.sessionFactoryCommon.openSession();
        try{
            String hqlQuery = "HQL query to update Amount Table where userId = userId";
            session.createQuery(hqlQuery).executeUpdate();
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
        finally
        {
            session.close();
        }
    }
    public void transferMoney(String fromUserId, String toUserId, double amount)
    {

        Session session = null;
        try
        {
            session = this.sessionFactoryCommon.openSession();
            query = "HQL query to get previous amount from sender account";
            double prevSenderamount = (double) query.uniqueResult();
      if(prevAmount>=amount)
      {
        String query1 = "HQL query to update sender account";
        session.createQuery(hqlQuery).executeUpdate();
        String query1 = "HQL query to get previous amount from receiver account";
        double prevReceiveramount = (double) query.uniqueResult();
        String query3 = "HQL query to update receiver account";
        session.createQuery(hqlQuery).executeUpdate();
      }
      else
      {
        throw myException("Insufficient Amount"); 
      }

            System.out.println("1. Employee save called without transaction, id="+id);
        }
        catch(Exception ex)
        {
            System.out.println("Exception Block");
            ex.printStackTrace();
        }
        finally
        {
            session.close();
        }
    }
}

这是执行数据库调用的正确方法吗? 请尝试用简单的方式解释- 预先感谢您。

最佳答案

How one daoImplementation object(its singleton) can handle multiple requests?if suppose thousand people are sending request that need to access daoImplementation class method which takes 10 sec for each request then the delays for 1000th request will be 10000 sec.

不是,因为线程的原理是并发执行。 DAO 方法不应该同步,因此线程会很乐意同时调用您的 DAO,就像它们对 Controller 所做的那样。

In daoImplementation class i have autowired SessionFactory which is also singleton and thread safe(that means for each request it will create one session thread)

没有。这仅仅意味着所有线程可以同时使用同一个 SessionFactory 实例,没有任何问题。不会创建额外的线程。

Suppose thousand people are trying to access same method in daoImplementation class, so 1000 session object will be created.How these thousand object will interact with database so that there will be not much delay in each request and how the databse will maintain consistency? Also session is thread safe,how it will impact my system.

数据库使用其 ACID 属性来确保所有事务都是隔离的并同时运行。 session 不是线程安全的,但这不是问题,因为每个线程都使用自己的 session ,不与其他线程共享。

现在,关于您的代码,不,它没有做正确的事情:

  • 您不应自行打开和关闭 session 。相反,您应该只询问当前 session ,Spring 会为您打开和关闭该 session ,并且该 session 与当前事务绑定(bind)。
  • 您通常不应在 Hibernate 中使用更新查询。只需获取实体并修改它们,Hibernate 就会为您保存它们的状态。这就是使用 ORM 的全部原理。

关于java - session 如何使用 Spring MVC 和 hibernate 处理多个请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40859267/

相关文章:

java - RESTeasy/JAXB 的 JSON 解析错误

Java - 如何创建屏幕层以在游戏中加载 UI?

Java lambda 表达式、转换和比较器

带有内置 Tomcat 服务器的 Spring Boot 独立应用程序 Vs 构建 war

java - Spring Data 更新多对一属性

java - 在gradle中创建zip(zip任务)时如何创建一个空文件夹?

java - JPA Spring Repository 中的 Group By 之前的排序

java - 将多个 HttpSessionIdResolver 与 Spring 一起使用

java - 从 IntelliJ 使用 Hibernate 连接到 PostgreSQL 服务器

java - 在 native Hibernate 中设置 FetchMode