会话如何使用SpringMVC和hiberate处理多个请求

时间:2016-11-29 06:37:27

标签: java spring hibernate spring-mvc spring-transactions

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

现在,在该请求进入daoImplementation方法之后将进行数据库工作。在daoImplementation类中我已经自动装配了SessionFactory,它也是单例和线程安全的(这意味着每个请求它将创建一个会话线程)。在我的方法中我正在创建会话对象来进行我的交易。 现在我的第二个怀疑 - 假设有数千人试图在daoImplementation类中访问相同的方法,因此将创建1000个会话对象。这千个对象如何与数据库交互,以便每个请求中没有太多延迟以及数据库如何保持一致性? 会话是线程安全的,它将如何影响我的系统。

现在我的第三个怀疑 - 对于转移,首先我需要获取发件人帐户中的当前金额,然后检查它是否小于他想要转移到收款人帐户的金额,然后从发件人帐户中扣除那么多金额,然后在收件人中添加那么多金额帐户,然后关闭session.Being初学者,我会写这样的代码 -

angular-material textarea

这是进行数据库调用的正确方法吗? 请尝试以简化的方式解释 - 提前谢谢。

1 个答案:

答案 0 :(得分:1)

  

一个daoImplementation对象(它的单例)如何处理多个请求?如果假设有数千人发送需要访问daoImplementation类方法的请求,每个请求需要10秒,那么第1000个请求的延迟将是10000秒。

不,因为线程的原理是它们并发执行。 DAO方法不应该同步,因此线程会愉快地同时调用您的DAO,就像它们对控制器一样。

  

在daoImplementation类中我有自动装配的SessionFactory,它也是单例和线程安全的(这意味着每个请求它将创建一个会话线程)

没有。这只是意味着所有线程可以同时使用相同的SessionFactory实例而没有任何问题。不会创建其他线程。

  

假设有数千人试图在daoImplementation类中访问相同的方法,因此将创建1000个会话对象。这千个对象如何与数据库交互,以便每个请求中没有太多延迟以及数据库如何保持一致性?会话是线程安全的,它将如何影响我的系统。

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

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

  • 您不应该自己打开和关闭会话。相反,您应该只询问当前会话,Spring会为您打开和关闭,并且绑定到当前事务。
  • 您通常不应该使用Hibernate的更新查询。只需获取实体,修改它们,Hibernate将为您保存状态。这是使用ORM的整个原则。