我们有几个 JBoss 服务器位于使用循环策略的硬件负载平衡器后面。我们所有的(JBoss)客户端过去都偶尔连接,这些客户端会正确地进行负载平衡。但是,一个新客户端每分钟发送约 100 个查询,这些查询都被定向到同一台服务器。
我想正在发生的事情是远程客户端创建其初始上下文,进行查找,并在一段时间(大约 15 秒)内保持与 JNDI 服务器的连接,以节省重新创建连接的开销。这意味着第 2 个和第 N 个请求将发送到同一台服务器。我们用以下代码证明了这一点(使用 JBoss 库的 Jython):
def __call__(self):
p = Properties()
p[Context.PROVIDER_URL] = "jnp://my.load.balancer:1099"
p[Context.INITIAL_CONTEXT_FACTORY] = JndiLoginInitialContextFactory.name
p[Context.SECURITY_PRINCIPAL] = <redacted>
p[Context.SECURITY_CREDENTIALS] = <redacted>
ctx = InitialContext(p)
home = ctx.lookup("ejb/ServerNameService")
ejbQuery = home.create()
print "Server name: %s", (ejbQuery.getServerName())
ctx.close()
现在,如果我在同一个 JVM(多线程)中调用 100 次,那么我总是得到同一个服务器。如果我用新的 JVM 调用它 100 次,那么我会得到一个混合。
有什么方法可以在不使用集群技术的情况下强制 JNDI 重新协商它的初始连接?