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