【发布时间】:2013-10-23 18:35:31
【问题描述】:
如何跨 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。
【问题讨论】:
-
2 阶段提交是您需要查看的内容。
-
最好在数据库字段中使用标志,而不是尝试在应用程序级别解决问题。
-
因此可能需要一个单线程应用程序来侦听特定端口,并且每个应用程序都会调用此端口而不是调用方法,因此您需要注意整个请求。
-
+1 到数据库。确保它是事务性的(即不是 MyISAM)。
-
一个数据库,真的,我的意思是 1990 年代。数据库绝对是实现分布式锁的最慢和最差的方法!多么糟糕的建议和懒惰的没有灵感的解决方案。你想要的是distributed lock manager。 太糟糕了,你不能投票给 cmets!
标签: java concurrency jvm synchronized