このバージョンはまだ開発中であり、まだ安定しているとは見なされていません。最新の安定バージョンについては、Spring LDAP 3.3.3 を使用してください! |
プーリングのサポート
LDAP 接続をプールすると、LDAP の対話ごとに新しい LDAP 接続を作成するオーバーヘッドを軽減できます。Java LDAP プーリングのサポート (英語) は存在しますが、接続の検証やプールのメンテナンスなど、構成オプションと機能が制限されています。Spring LDAP は、ContextSource
ごとに詳細なプール構成をサポートします。
プーリングのサポートは、アプリケーションコンテキスト構成で <ldap:context-source />
要素に <ldap:pooling />
子要素を提供することによって提供されます。読み取り専用および読み取り / 書き込み DirContext
オブジェクトは別々にプールされます (anonymous-read-only
が指定されている場合)。Jakarta コモンズプール [Apache] (英語) は、基礎となるプールの実装を提供するために使用されます。
DirContext
検証
JDK が提供する LDAP プーリング機能ではなく、カスタムプーリングライブラリを使用する主な動機は、プールされた接続の検証です。検証により、プールされた DirContext
接続をチェックして、プールからチェックアウトするとき、プールにチェックインするとき、プール内でアイドル状態になっているときに、それらが適切に接続および構成されていることを確認できます。
接続検証が構成されている場合、プールされた接続は DefaultDirContextValidator
を使用して検証されます。DefaultDirContextValidator
は、空の名前、"objectclass=*"
のフィルター、および objectclass
属性のみと 500 ミリ秒のタイムアウトで単一の結果を制限するように設定された SearchControls
を使用して DirContext.search(String, String, SearchControls)
を実行します。返された NamingEnumeration
に結果がある場合、DirContext
は検証に合格します。結果が返されないか、例外がスローされた場合、DirContext
は検証に失敗します。デフォルト設定は、ほとんどの LDAP サーバーで構成を変更しなくても機能し、DirContext
を検証する最速の方法を提供します。カスタマイズが必要な場合は、プール構成で説明されている検証構成属性を使用して実行できます。
非一時的と見なされる例外をスローすると、接続は自動的に無効になります。例: DirContext インスタンスが javax.naming.CommunicationException をスローすると、一時的でないエラーとして解釈され、追加の testOnReturn 操作のオーバーヘッドなしでインスタンスが自動的に無効になります。非一時的であると解釈される例外は、PoolingContextSource の nonTransientExceptions プロパティを使用して構成されます。 |
プール構成
DirContext プールの構成のために、<ldap:pooling />
エレメントで以下の属性を使用できます。
属性 | デフォルト | 説明 |
---|---|---|
|
| このプールから同時に割り当てることができる各型 (読み取り専用または読み取り / 書き込み) のアクティブな接続の最大数。正でない数値を無制限に使用できます。 |
|
| このプールから同時に割り当てることができる (すべての型の) アクティブな接続の全体的な最大数。正でない数値を無制限に使用できます。 |
|
| 追加の接続が解放されることなくプール内でアイドル状態を維持できる、各型 (読み取り専用または読み取り / 書き込み) のアクティブな接続の最大数。正でない数値を無制限に使用できます。 |
|
| 追加の接続を作成せずにプール内でアイドル状態を維持できる、各型 (読み取り専用または読み取り / 書き込み) のアクティブな接続の最小数。ゼロ (デフォルト) を使用して、何も作成しないようにすることができます。 |
|
| 例外をスローする前に接続が返されるのをプールが (接続が使用できない場合に) 待機する最大ミリ秒数。正でない数値を使用して、無期限に待機できます。 |
|
| プールが使い果たされたときの動作を指定します。
|
|
| プールから借用する前にオブジェクトを検証するかどうか。オブジェクトの検証に失敗した場合、そのオブジェクトはプールから削除され、別のオブジェクトを借用しようとします。 |
|
| オブジェクトがプールに返される前に検証されるかどうか。 |
|
| オブジェクトがアイドルオブジェクト evictor (存在する場合) によって検証されるかどうか。検証に失敗したオブジェクトは、プールから削除されます。 |
|
| アイドル状態のオブジェクト evictor スレッドの実行の間にスリープするミリ秒数。正でない場合、アイドルオブジェクトの Evictor スレッドは実行されません。 |
|
| アイドル状態のオブジェクト Evictor スレッド (存在する場合) の各実行中に検査するオブジェクトの数。 |
|
|
The minimum amount of time an object may sit idle in the pool before it is eligible for eviction by the idle object evictor (if any). |
|
| 接続を検証するときに使用する検索ベース。 |
|
| 接続を検証するときに使用する検索フィルター。 |
|
|
The ID of a |
|
|
|
プール 2 の構成
DirContext
プールを構成するために、<ldap:pooling2 />
要素で次の属性を使用できます。
属性 | デフォルト | 説明 |
---|---|---|
|
| このプールから同時に割り当てることができる (すべての型の) アクティブな接続の全体的な最大数。正でない数値を無制限に使用できます。 |
|
| キーごとに、プール (チェックアウトまたはアイドル) によって割り当てられるオブジェクトインスタンスの数の制限。制限に達すると、サブプールが使い果たされます。負の値は制限がないことを示します。 |
|
| 余分な接続が解放されることなく、プール内でアイドル状態を維持できる各型 (読み取り専用または読み取り / 書き込み) のアクティブな接続の最大数。負の値は制限がないことを示します。 |
|
| 追加の接続を作成せずにプール内でアイドル状態を維持できる、各型 (読み取り専用または読み取り / 書き込み) のアクティブな接続の最小数。ゼロ (デフォルト) を使用して、何も作成しないようにすることができます。 |
|
| 例外をスローする前に接続が返されるのをプールが (使用可能な接続がない場合に) 待機する最大ミリ秒数。正でない数値を使用して、無期限に待機できます。 |
|
| 新しいオブジェクトが利用可能になるまで待機するかどうか。max-wait が正の場合、 |
|
| オブジェクトを借用する前に検証するかどうか。オブジェクトの検証に失敗すると、借用は失敗します。 |
|
| オブジェクトがプールから借用される前に検証されるかどうかの指標。オブジェクトの検証に失敗した場合、そのオブジェクトはプールから削除され、別のオブジェクトを借用しようとします。 |
|
| オブジェクトがプールに返される前に検証されるかどうかの指標。 |
|
| オブジェクトがアイドルオブジェクト evictor (存在する場合) によって検証されるかどうかのインジケーター。検証に失敗したオブジェクトは、プールから削除されます。 |
|
| アイドル状態のオブジェクト evictor スレッドの実行の間にスリープするミリ秒数。正でない場合、アイドルオブジェクトの Evictor スレッドは実行されません。 |
|
| アイドル状態のオブジェクト Evictor スレッド (存在する場合) の各実行中に検査するオブジェクトの数。 |
|
|
The minimum amount of time an object may sit idle in the pool before it is eligible for eviction by the idle object evictor (if any). |
|
| アイドル状態のオブジェクト Evictor によるエビクションの対象となる前に、オブジェクトがプール内でアイドル状態を保つことができる最小時間。追加の条件として、少なくともキーごとの最小数のオブジェクトインスタンスがプール内に残っている必要があります。この設定は、正の値に設定されている場合、 |
|
| このプールで使用されるエビクションポリシーの実装。プールは、スレッドコンテキストクラスローダーを使用してクラスを読み込もうとします。それが失敗した場合、プールは、このクラスをロードしたクラスローダーを使用してクラスをロードしようとします。 |
|
| プールは、接続を公平に借用するのを待っているスレッドにサービスを提供します。 |
|
| JMX は、プールのプラットフォーム MBean サーバーで有効になります。 |
|
| JMX 対応プールに割り当てられる名前の一部として使用される JMX ネームベース。 |
|
| JMX 対応プールに割り当てられる名前の一部として使用される JMX 名のプレフィックス。 |
|
| プールが、アイドル状態のオブジェクトに対して LIFO (後入れ先出し) 動作を行うか、FIFO (先入れ先出し) キューとして動作するかを示す指標。LIFO は常にプールから最後に使用されたオブジェクトを返しますが、FIFO は常にアイドルオブジェクトプール内の最も古いオブジェクトを返します。 |
|
| 検証検索に使用するベース DN。 |
|
| 検証クエリに使用するフィルター。 |
|
|
The ID of a |
|
|
|
構成
プーリングを構成するには、次のように、<ldap:context-source>
要素にネストされた <ldap:pooling>
要素を追加する必要があります。
<beans>
...
<ldap:context-source
password="secret" url="ldap://localhost:389" username="cn=Manager">
<ldap:pooling />
</ldap:context-source>
...
</beans>
実際の状況では、おそらくプールオプションを構成し、接続の検証を有効にします。前の例は、一般的な考え方を示しています。
既知の問題
このセクションでは、Spring LDAP を使用するときに発生することがある課題について説明します。現在、以下の課題をカバーしています。
カスタム認証
PoolingContextSource
は、ContextSource.getReadOnlyContext()
から取得されたすべての DirContext
オブジェクトが同じ環境を持ち、同様に、ContextSource.getReadWriteContext()
から取得されたすべての DirContext
オブジェクトが同じ環境を持っていると想定します。これは、AuthenticationSource
で構成された LdapContextSource
を PoolingContextSource
でラップしても、期待どおりに機能しないことを意味します。プールは最初のユーザーの資格情報を使用して設定され、新しい接続が必要でない限り、リクエスト元スレッドの AuthenticationSource
によって指定されたユーザーの後続のコンテキストリクエストは満たされません。