Java Spring MVC与Soap服务多线程&;多服务器

Java Spring MVC与Soap服务多线程&;多服务器,java,spring,multithreading,spring-mvc,thread-safety,Java,Spring,Multithreading,Spring Mvc,Thread Safety,我正在尝试创建一个具有并发性的小型SpingMVC应用程序。情景: 1:我使用的是带有4个节点的WAS Websphere Server和负载平衡器 2:我有两个模块:(a)Web模块(b)带有Soap Web服务的服务模块 3:Web层将使用WebServiceTemplate调用服务层 4:服务层有一些业务逻辑,例如:计算存款总额、取款总额等 我使用的方法: 1:我在“存款、取款”等业务逻辑方法中使用了同步的,但不起作用 2:我没有在@Controller中使用任何范围(我知道这是Singl

我正在尝试创建一个具有并发性的小型SpingMVC应用程序。情景:

1:我使用的是带有4个节点的WAS Websphere Server和负载平衡器

2:我有两个模块:(a)Web模块(b)带有Soap Web服务的服务模块

3:Web层将使用WebServiceTemplate调用服务层

4:服务层有一些业务逻辑,例如:计算存款总额、取款总额等

我使用的方法:

1:我在“存款、取款”等业务逻辑方法中使用了同步的,但不起作用

2:我没有在@Controller中使用任何范围(我知道这是Singleton)

问题:

我真的需要将@Controller的作用域更改为“Request”吗

我的假设是:如果我将范围更改为请求,会不会使应用程序变慢?例如,即使只是获取记录(无更改请求),它也会减慢速度


我们可以使用哪些方法使代码的唯一部分“提取”或“存放”在服务模块中实现线程安全?

如果您有4个节点,这意味着您的应用程序部署了4次。因此,使用像
synchronized
关键字这样的本地同步将只使来自该实例的线程在关键部分访问时同步

您必须使用从外部控制同步的东西。为此,我使用了Redis和Java上的Redisson库

  • 安装Redis实例
  • 将Redisson添加为项目的依赖项
  • 初始化RedissonClient类
  • 访问关键部分(即
    提取
    存款
    )时,您可以使用RedissonClient获取锁,并在操作完成后释放
  • 通过这样做,同步信息将保存在Redis上,所有实例都将共享同步信息,这将不允许任何人进入关键部分


    由于您有两个关键部分:
    取款
    存款
    ,因此在获取锁时必须使用这些(或其他)名称。

    谢谢!这是一个很好的建议。还有一个问题。我们是否必须将@Controller的“Scope”更改为“Request”呢?@greencheese否。
    @Controller
    应该始终是一个单例,它是处理所有请求的bean。如果您需要某个特定请求中的某些内容,那么可以使用
    @request
    bean。