• 締切済み

LDAPにアクセスしてNamingEnumerationが遅延する

お世話になります。 初めてLDAPにアクセスしたのですが、特定の検索条件の際にNamingEnumerationをhasMoreする所が遅延します。 *遅い時は2秒ほど掛かります。 同じ現象になって修正した方がいましたら、ご教授お願い致します。 ■ソース(見づらくてすいません) //LDAP接続設定 Hashtable env = new Hashtable(); DirContext ctx = new InitialDirContext(env); //取得属性 String str = ''; SearchControls cons = new SearchControls(); cons.setSearchScope(SearchControls.SUBTREE_SCOPE); cons.setReturningObjFlag(true); cons.setReturningAttributes(str); //検索条件 String filter = ""; NamingEnumeration res = ctx.search(base, filter, cons); while (res.hasMore()) { SearchResult entry = (SearchResult) res.next(); Attributes attrs = entry.getAttributes(); for (int i = 0; i < str.length; i++) { Attribute attr = attrs.get(str[i]); System.out.print((String) attr.get()); } System.out.println(); } よろしくお願い致します。

みんなの回答

回答No.1

LDAPは、5、6年くらい前に使ってました。懐かしい。 とりあえず↓の部分ですが、falseをセットしてください。 cons.setReturningObjFlag(true); これは、SearchResultからDirContextオブジェクトを取得する時に使うもので、属性しか使用しないのであれば不要です。 ↓こんなことをやりたい場合ね。 SearchResult entry = (SearchResult) res.next(); DirContext dc = (DirContext) entry.getObject(); SearchResultオブジェクトからもgetNameInNamespace()で名前空間が取得できるし、DirContextオブジェクトから相対指定で属性取得等の操作ができるので、ベースとなるDirContextオブジェクトが一つあれば、他のオブジェクトは基本的に不要だと思います。 あと、取得したい属性が限定されているのであれば(というか限定するべき)、SearchControlsに取得属性を設定するべきです。 ↓こんな感じで。 cons.setReturningAttributes(new String[]{"cn", "uid"}); さらに件数が決まっている場合は、setCountLimit()で件数を限定するとより早くなります。

k_tanpin
質問者

お礼

miyachocom様。 ご回答ありがとうございます。 属性取得のみの場合は、 cons.setReturningObjFlag(false); にするのですね。 取得する属性は、String[]で渡しました。 しかし、データ件数6件の場合 NamingEnumeration res = ctx.search(base, filter, cons); は0.1秒ほどなのですが while (res.hasMore()) の所が2秒かかる場合があります。 これは、LDAPアクセスの問題では無くて、javaの問題だと思うのですが こんな現象になった事は無いですか? 説明下手で申し訳ありません。 宜しくお願い致します。

関連するQ&A