2015年05月29日
LDAP 検索の分割アクセス
登録済みユーザの一覧を作成するなどの場合、いっぺんにアクセスしてしまうと、メモリの問題を引き起こしたりする可能性があるので、件数を区切って分割アクセスしたい場合がある
javax.naming.ldap.PagedResultsControl をLDAPコンテキスト (javax.naming.ldap.LdapContext) に対して追加してやればできるようになる
しかも Java ドキュメント にサンプルコードも掲載されており、非常に助かる
ポイントは、初回は null である byte[] javax.naming.ldap.PagedResultsResponseControl#getCookie() の値が null になるまで繰り返すということだ
こうしないと無限ループになったり、初回ページしかアクセスできなかったりということになる
おおざっぱな構造を示すと以下のようになる
これでめでたくページアクセスできるようになった
最初から件数がわかっているようなものであれば、こうしなくても大丈夫であろうが、検索結果が想定以上(導入当初は1000件程度だったものが、運用後1億件程度に膨れたなど)になった場合でも耐えうるコードが書けるだろう
★☆★☆★☆ ナウでヤングなレンタルサーバー!ロリポップ! ☆★☆★☆★
月額100円(税抜)〜容量最大400GB!大人気のWordpressも簡単インストール★
javax.naming.ldap.PagedResultsControl をLDAPコンテキスト (javax.naming.ldap.LdapContext) に対して追加してやればできるようになる
しかも Java ドキュメント にサンプルコードも掲載されており、非常に助かる
ポイントは、初回は null である byte[] javax.naming.ldap.PagedResultsResponseControl#getCookie() の値が null になるまで繰り返すということだ
こうしないと無限ループになったり、初回ページしかアクセスできなかったりということになる
おおざっぱな構造を示すと以下のようになる
// LDAP コンテキストを生成
LdapContext context = new InitialLdapContext();
// 初回クッキーは null
byte[] cookie = null;
// ページサイズ
int pageSize = 100;
// ページ制御をコンテキストに追加
context.setRequestControls(new Control[]{new PagedResultControl(pageSize, Control.CRITICAL);
do {
NamingEnumeration en = context.search(検索オプション);
// 検索結果の処理(pageSize 分だけループすることになるだろう)
...
// セットしたはずの PagesResultResponseControl を探し出してクッキー値を取得する
// 具体的なコードはマニュアルページに書いてあるが、Control 配列から見つけ出すという手法
PagedResultControl ctl = findPagedResultControl(context);
cookie = ctl.getCookie();
// 次回アクセスのために再度 PagedResultControl をセットする
context.setRequestControls(new Control[]{new PagedResultControl(pageSize, cookie, Control.CRITICAL);
} while (null != cookie);
これでめでたくページアクセスできるようになった
最初から件数がわかっているようなものであれば、こうしなくても大丈夫であろうが、検索結果が想定以上(導入当初は1000件程度だったものが、運用後1億件程度に膨れたなど)になった場合でも耐えうるコードが書けるだろう
★☆★☆★☆ ナウでヤングなレンタルサーバー!ロリポップ! ☆★☆★☆★
月額100円(税抜)〜容量最大400GB!大人気のWordpressも簡単インストール★
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/3723384
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック