【发布时间】:2012-05-08 16:09:52
【问题描述】:
我们有几台 JBoss 服务器位于使用循环策略的硬件负载平衡器后面。我们所有的(JBoss)客户端过去都偶尔连接,这些客户端会正确地进行负载平衡。但是,一个新客户端每分钟发送约 100 个查询,这些查询都被定向到同一台服务器。
我想正在发生的事情是远程客户端创建了它的初始上下文,进行查找,并在一段时间(大约 15 秒)内保持与 JNDI 服务器的连接,以节省重新创建连接的开销。这意味着第 2 个和第 N 个请求将发送到同一台服务器。我们用以下代码证明了这一点(Jython 使用 JBoss 库):
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 重新协商它的初始连接?
【问题讨论】:
-
JNDI 只是一个 API,它没有说明协议或连接管理。这是特定于实现的,在这个 JBoss 的 JNP 协议中。
-
您是否启用了会话粘性?然后是它的预期行为。
-
@mazaneicha 不,它不粘