我已经使用Apache commons-pool为LDAP连接实现了一个池。我无法使用JNDI提供的池功能(http://download.oracle.com/javase/jndi/tutorial/ldap/connect/pool.html),因为我使用SSL连接(使用自定义(Oracle提供的)套接字工厂(java.naming.ldap.factory.socket
env值集),它将上下文从JNDI池中取消)到LDAP服务器,因此即使设置了相应的池属性,也会自动禁用JNDI中的池设施。
现在谈到将InitialDirContext
的池化实例返回到池中并且需要检查它是否仍然可用且尚未被用户关闭或者已丢失与LDAP服务器由于其他原因。
这是我目前查找已知存在的特定用户的DN的地方:
final InitialDirContext ctx = internalPooledLDAPConnection.getCtx();
final Subscriber sub = internalPooledLDAPConnection.getSub();
SearchControls ctls = new SearchControls();
ctls.setSearchScope(2);
ctls.setReturningAttributes(new String[] { "dn"});
NamingEnumeration resultSet = ctx.search(sub.getUserSearchBase()[0], "(&(objectclass=*)(uid=orcladmin))", ctls);
如果此操作没有抛出任何异常,那么我内部池化Ldap连接中的InitialDirContext
仍然可用,并且可以安全地从池中重新使用。
但是我想知道这是否是可以在这里执行的“最便宜”的连接健全性检查,或者是否存在更便宜的LDAP操作,我可以使用它。
答案 0 :(得分:3)
LDAP比较操作可能比搜索更有效,因为只有一个响应(搜索匹配一个条目,你将有两个响应 - 一个用于条目,第二个用于表示搜索结果的结尾)。
但是,您可能还想考虑JNDI的替代方案,因为为LDAP提供了一个众所周知的错误API。还有其他用于执行LDAP通信的Java库比JNDI好得多。特别是,UnboundID LDAP SDK for Java(我是开发人员)为LDAP通信提供了功能丰富,易于使用,高性能的API。它具有丰富的连接池功能,包括运行状况检查,故障转移和负载平衡。有关UnboundID LDAP SDK与JNDI和Netscape Directory SDK for Java提供的功能的比较,请参阅http://www.unboundid.com/products/ldap-sdk/docs/advantages/comparison.php。
答案 1 :(得分:2)
LDAP绑定就像您可以获得的一样简单。这是JNDI中的reconnect()方法。
但是对于你正在做的事情必须有所保留。如果通过SSL禁用池,则必须有安全原因,因此在设计自己的池时需要进行自己的安全性分析。
答案 2 :(得分:2)
我有类似的问题(我自己的游泳池)。我的方法是期望任何混合连接都死了。我让我的池做了两次任何查询:第一次它可能会失败,所以重新连接并再次尝试,但第二次尝试的失败是真实的,然后传播。
总结一下,我不是使用特定的ping查询,而是让应用程序自己的查询充当潜在的ping。
至于最便宜的查询,这可能相当便宜!你可能甚至不需要为这个绑定 - 我不记得了。
// The rootDSE attributes, Microsoft Active Directory
Attributes attrs = ldapContext.getAttributes("");
String ldapRootDN = (String) attrs.get("rootDomainNamingContext").get(0);
答案 3 :(得分:2)
我们使用对0.0.0.0.0的控件进行检查,当然也不存在以测试连接是否处于活动状态。我记得这是OpenLDAP(jldap)调用如何进行检查。作为控制它的rootDSE通常允许匿名,这将检查连接是否良好,但不检查绑定状态。
答案 4 :(得分:1)
为什么不发送无效搜索未知或垃圾属性。整个要点只是ping而不是实际过程。