Я реализовал пул для соединений LDAP, используя Apache commons-pool. Я не могу использовать функцию пула, предоставляемую 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);
Если эта операция не вызывает каких-либо исключений, то InitialDirContext
внутри моего внутреннего пула Ldap-соединения все еще может использоваться и может быть безопасно передан из пула для повторного использования.
Однако мне интересно, является ли это «самой дешевой» проверкой работоспособности соединения, которую можно выполнить здесь, или существует ли гораздо более дешевая операция LDAP, которую я мог бы использовать вместо этого.