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

1:我正在将WAS Websphere Server与4个节点一起使用Load Balancer

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

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

4:服务层具有一些业务逻辑,例如:计算要存入,提取的总金额等。

我使用的方法:

1:我在业务逻辑方法“存款,提款”等中使用了同步-无效

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

题:

我真的需要将@Controller的范围更改为“ Request”吗?

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

我们可以使用哪些方法来使代码的唯一部分-服务模块中的“撤回”或“存款”线程安全?

最佳答案

如果您有4个节点,则意味着您的应用程序将部署4次。因此,使用类似synchronized关键字的本地同步将仅使该实例中的线程在关键节访问时同步。

您必须使用一些可以从外部控制同步的东西。我已经在Java上使用Redis和Redisson库。


安装Redis实例
将Redisson添加为项目的依赖项
初始化RedissonClient类
当访问关键部分(WithdrawDeposit)时,您将使用RedissonClient获取锁,并在操作完成后释放。


这样,同步信息将保存在Redis上,并且所有实例将共享该信息,这将不允许任何信息进入关键部分。

因为有两个关键部分:WithdrawDeposit,所以在获取锁时必须使用那些(或其他)名称。

08-04 16:22