当前位置: 首页 > 面试题库 >

跨JVM同步方法

益银龙
2023-03-14
问题内容

如何跨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。


问题答案:

您询问有关跨JVM同步方法的问题。这就需要一个处理分布式进程的库。有很多选择,这里只是几个:

  1. Terracotta-支持将某些字段配置为在JVM之间“共享”,因此您可以使用标准的JVM锁定,例如synced关键字,它可以在多个JVM上使用。
  2. JGroups -Jgroups是用于分布式应用程序的工具包。锁定是它提供的功能之一。这是他们文档中的一个例子

无论使用哪种库,设置分布式锁定都不是一件容易的事。如果需要的话,很好,但是对于您的示例,这似乎有点过头了。其他选项:

  • 在数据库中添加唯一性约束,让其强制执行唯一性。这可能会对数据库的性能产生影响,因此它实际上取决于您希望获得多少流量。
  • 让负载均衡器使用用户名(或用户名的哈希)作为用于将请求分配给Web服务器的密钥。这将确保来自同一用户名的请求每次都将到达同一Web服务器-不需要分布式锁,只需使用常规锁即可。


 类似资料:
  • 请看下面给我带来麻烦的方法: 然后是run方法:

  • 问题内容: 我正在查看包含同步方法的第三方库中的一些代码,在此方法中,有一个锁定在实例变量上的同步块。与此类似: 这有意义吗?如果是这样,在同步方法中使用同步语句有什么好处? 鉴于同步方法锁定了整个对象,对我来说似乎是多余的。在使用非私有的实例变量时,这种方法是否有意义? 问题答案: 在您的示例中,该方法 同时 锁定了和的实例。其他方法可能仅锁定对象的实例 或 对象。 因此,是的,这完全取决于他们

  • 问题内容: 如何同步运行Windows上的两个Java进程? 我正在寻找类似Win32 Named Mutex对象的对象,该对象允许两个进程使用相同的锁定对象。 谢谢 问题答案: 在Java中无法完成所需的操作。不同的Java应用程序将使用不同的JVM,将它们完全分隔成不同的“黑匣子”。但是,您有2个选择: 使用插座(或通道)。基本上,一个应用程序将打开侦听套接字并开始等待,直到它接收到一些信号为

  • 同步调用异步方法最安全的方法是什么?

  • 为什么下面的代码不能保证多个线程之间total_home数字的唯一性,即使逻辑处于同步块中。 } } } 这是一个程序示例。试着运行5-10次,你会发现total_home的值并不是每次都是唯一的。

  • 这个应用程序的每个JVM应该使用相同的数据库吗?否则跟踪令牌不会在同一个应用程序中“共享”? 如何在运行传奇的相同应用程序中拆分事件?一个saga类型或saga实例是否总是在同一个应用程序上处理(直到它被关闭,所以另一个实例负责它)? 还是每个JVM都接收事件,并且每个相同类型的传奇都将运行?(并导致发送重复命令和错误) 等。还有很多问题。