我正在尝试创建一个具有并发性的小型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类
当访问关键部分(Withdraw
或Deposit
)时,您将使用RedissonClient获取锁,并在操作完成后释放。
这样,同步信息将保存在Redis上,并且所有实例将共享该信息,这将不允许任何信息进入关键部分。
因为有两个关键部分:Withdraw
和Deposit
,所以在获取锁时必须使用那些(或其他)名称。