如何跨JVM同步方法?
我的示例是一个Web应用程序,它限制用户名不能多次登录(换句话说,第一个用户可以登录,但如果另一个用户使用相同的用户名登录,则会被拒绝)。
Web应用程序部署在多个服务器上,因此有多个JVM,用户可以尝试使用不同的服务器登录,具体取决于负载均衡器。
以下是该方法的外观
public synchronized static SessionData logonSync(String userName, String password) throws Exception
{
int count = DB.count("sessions", "WHERE user_name=?", userName);
if (count > 0)
{
throw new Exception("logon.error.loginAlreadyUsed");
}
return logon(userName, password);
}
由于同步方法,它可以在1个应用服务器上正常工作,但是跨多个JVM?两个用户可能正在尝试同时登录不同的Web应用程序。我该怎样阻止这个?
*编辑* 如果您的解决方案想要利用某些事务缓存方法,该应用程序也会使用Memcached。
答案 0 :(得分:12)
您询问了跨JVM同步方法的问题。这需要一个处理分布式进程的库。有很多选择,这里只是几个:
无论您使用哪个库,设置分布式锁定都不容易。如果你需要它,很好,但对于你的例子,这似乎有点矫枉过正。其他选择: