gpt4 book ai didi

java - JNDI 查找是否保持连接打开 - 这就是我的负载平衡被破坏的原因吗?

转载 作者:行者123 更新时间:2023-12-01 17:31:28 25 4
gpt4 key购买 nike

我们有几台 JBoss 服务器位于使用循环策略的硬件负载平衡器后面。我们所有的(JBoss)客户端过去都是偶尔连接的,并且这些客户端会正确地进行负载平衡。然而,新客户端每分钟发送约 100 个查询,并且这些查询都被定向到同一服务器。

我想象正在发生的事情是,远程客户端创建其初始上下文,进行查找,并将与 JNDI 服务器的连接保持一段时间(大约 15 秒),以节省重新创建连接的开销。这意味着第二个和第 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 是一种对象缓存。因此,如果您在同一虚拟机中多次请求相同的名称,您总是会得到相同的结果。这是正确的行为,但你不喜欢它。

解决方案是在 JNDI 中注册工厂而不是实例本身。这样,工厂就可以从 JNDI 获取创建连接的信息,但每次调用时都会返回一个新实例(或从内部池返回一个实例)。

同样的方法也用于 JDBC。不是将 JDBC 连接添加到 JNDI 缓存,而是添加一个 DataSource - 它是 JDBC java.sql.Connection 实例的工厂。

关于java - JNDI 查找是否保持连接打开 - 这就是我的负载平衡被破坏的原因吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10502304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com