2011-05-05 2 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 값 세트). LDAP 서버에 JNDI 풀링에서 컨텍스트를 제외시킵니다. 따라서 해당 풀링 등록 정보가 설정되어 있어도 JNDI 내의 풀링 기능은 자동으로 비활성화됩니다.가장 간단한 (가능한 한 복잡한) LDAP 작업이 무엇입니까

InitialDirContext의 풀링 된 인스턴스가 풀로 반환되고 여전히 사용 가능하고 사용자가 닫지 않았는지 또는 만료되었는지 LDAP 서버에 연결이 끊어 졌는지 여부를 확인해야합니다. 다른 원인으로. 이 작업은 예외가 발생하지 않는 경우

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 여전히 사용할 수 :

이것은 내가 현재 존재하는 것으로 알려진 특정 사용자의 DN을 찾아 볼 곳이다 재사용을 위해 수영장에서 안전하게 주어질 수 있습니다.

그러나 이것이 여기에서 수행 할 수있는 '가장 저렴한'연결 위생 확인인지 또는 내가 대신 사용할 수있는 훨씬 저렴한 LDAP 작업이 있는지 궁금해합니다.

답변

3

응답이 하나뿐이기 때문에 LDAP 비교 연산이 검색보다 효율적일 수 있습니다 (항목과 일치하는 검색을 사용하면 항목에 대한 응답과 항목에 대한 두 가지 응답이 있음) 검색 결과의 끝).

그러나 LDAP에 악명 높은 API를 제공하기 때문에 JNDI의 대안을 고려할 수도 있습니다. JNDI보다 훨씬 나은 LDAP 통신을 수행하는 다른 Java 라이브러리가 있습니다. 특히 Java 용 UnboundID LDAP SDK (개발자 용)는 LDAP 통신을 위해 기능이 풍부하고 사용하기 쉽고 고성능 API를 제공합니다. 상태 검사, 장애 조치 및로드 균형 조정과 같은 풍부한 연결 풀링 기능을 제공합니다. UnboundID LDAP SDK가 JNDI 및 Java 용 Netscape Directory SDK에서 제공하는 기능을 비교하려면 http://www.unboundid.com/products/ldap-sdk/docs/advantages/comparison.php을 참조하십시오.

+0

제안 해 주셔서 감사합니다. 불행히도 JNDI LDAP 연결을 신뢰할 수있는 Oracle 애플리케이션 서버 라이브러리를 사용하기 때문에 JNDI에서 다른 것으로 전환 할 수 없습니다. – BertNase

1

알려지지 않은 또는 가비지 특성을 유효하지 않은 검색으로 보내지 마십시오. 요점은 단순히 실제 프로세스가 아니라 핑 (ping)하는 것입니다.

+0

시도해 봤지만, 현존하는 엔트리를 찾는데 큰 차이가 없었지만 어쨌든 고맙다. – BertNase

2

LDAP 바인드는 얻을 수있는만큼 간단합니다. 이것은 JNDI의 reconnect() 메소드입니다.

그러나 무엇을하고 있는지에 대한 예약이 있어야합니다. SSL을 통해 풀링을 사용할 수없는 경우 보안상의 이유로 인해 풀링을 설계 할 때 자체 보안 분석을 수행해야합니다.

+0

잠재적 인 보안 문제를 지적 해 주셔서 감사합니다. – BertNase

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 검사는 서버에 의해 닫힌 연결 만 감지하고 서버가 충돌하거나 네트워크가 다운되어 연결이 끊어지지 않는 것을 감지하지 못합니다. –

관련 문제