2011-05-05 30 views
4

我已经使用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中的池设施也会自动禁用。什么是最简单(即最不复杂)的LDAP操作

现在谈到池的实例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操作。

回答

3

LDAP比较操作可能比搜索更有效,因为只有一个响应(搜索与条目匹配,您将有两个响应 - 一个用于输入,另一个用于指示搜索结果的结尾)。

但是,您可能还想考虑JNDI的替代方案,因为它提供了一个众所周知的用于LDAP的糟糕API。还有其他用于执行LDAP通信的Java库比JNDI好得多。特别是,UnboundID LDAP SDK for Java(我是开发人员)为LDAP通信提供了功能丰富,易于使用的高性能API。它具有丰富的连接池功能,包括健康检查,故障转移和负载平衡。请参阅http://www.unboundid.com/products/ldap-sdk/docs/advantages/comparison.php以比较UnboundID LDAP SDK与JNDI和Netscape Directory Java for Java提供的功能。

+0

谢谢您的建议。不幸的是我不能从JNDI切换到其他的东西,因为我使用了一些Oracle JNDI LDAP连接的应用服务器库。 – BertNase 2011-05-05 11:08:02

1

为什么不发送无效搜索未知或垃圾属性。整个过程只是简单地ping通,而不是实际的过程。

+0

试过了,没有显着差异(在操作的持续时间)找到一个存在的条目,但无论如何感谢。 – BertNase 2011-05-05 11:09:17

2

LDAP绑定就像您可以获得的一样简单。这是JNDI中的reconnect()方法。

但是对于你在做什么必须有所保留。如果通过SSL禁用共享池,则必须存在安全原因,因此您在设计自己的共享池时需要进行自己的安全分析。

+0

感谢您指出了潜在的安全问题 - 我会看看到它。 – BertNase 2011-05-05 11:10:29

2

我有类似的问题(我推出了自己的游泳池)。我的做法是期望任何汇集的连接都已经死亡。我让我的池做两次任何查询:第一次它可能会失败,所以重新连接并再试一次,但第二次尝试失败是真实的,并传播。

总而言之,我没有使用特定的ping查询,而是让应用程序自己的查询充当潜在的ping。

只要最便宜的查询,这可能是相当便宜!你可能甚至不需要为这个绑定 - 我不记得了。

// The rootDSE attributes, Microsoft Active Directory 
Attributes attrs = ldapContext.getAttributes(""); 
String ldapRootDN = (String) attrs.get("rootDomainNamingContext").get(0); 
2

我们对控件0.0.0.0进行检查。0这当然永远不会存在来测试连接是否有效。我记得这是OpenLDAP(jldap)调用如何执行检查。由于RootDSE的用于控制它通常,允许匿名,这将检查是否连接好,但不检查绑定状态。

+0

对于发送0.0.0.0的JLDAP检查仅检测到服务器已关闭的连接,但它未检测到由于服务器崩溃或网络已关闭而导致挂起的连接。 – 2015-11-19 11:49:15

相关问题