9

Java プログラムを使用して を作成し、javax.naming.ldap.LdapContext それに対して操作を行う状況がありsearch()ます。これにより、基になる接続が作成されます。次に、Java アプリ スレッドをスリープ状態にし、その間に LDAP サーバーを再起動します (OpenLDAP に注意してください)。LdapContextアプリ スレッドが起動し、以前に作成されたに対して操作を実行しようとすると、 " CommunicationException: Connection is closed" がスローされます。

私が望むのは、接続を再確立できることです。

LdapContextメソッドがあることがわかりますreconnect()-ここで、コントロールを として渡しますnull。ただし、これは何の効果もありません。Sun LDAP 実装で見たのは、LDAP サーバーが再起動されたときに、Sun 実装によって維持された ConnectionPool が、基礎となるcom.sun.jndi.ldap.LdapClientインスタンスを「usable=false」でマークしたことです。呼び出し時にreconnect()- を呼び出すだけで、フラグが であるかensureOpen()どうかを再度チェックします。それからそれは投げます-それで振り出しに戻ります。usablefalsefalseCommunicationException

私の質問は、Java アプリが外部 LDAP サーバーの再起動後も存続するにはどうすればよいかということです。新しいものLdapContextを再び作成することが唯一の方法ですか?洞察に感謝します。

例外のスタックトレースは次のとおりです。

javax.naming.CommunicationException: connection closed [Root exception is java.io.IOException: connection closed]; remaining name 'uid=foo,ou=People,dc=example,dc=com'
at com.sun.jndi.ldap.LdapCtx.doSearch(LdapCtx.java:1979)
at com.sun.jndi.ldap.LdapCtx.searchAux(LdapCtx.java:1824)
at com.sun.jndi.ldap.LdapCtx.c_search(LdapCtx.java:1749)
at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(ComponentDirContext.java:368)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:338)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:321)
at javax.naming.directory.InitialDirContext.search(InitialDirContext.java:248)
Caused by: java.io.IOException: connection closed
at com.sun.jndi.ldap.LdapClient.ensureOpen(LdapClient.java:1558)
at com.sun.jndi.ldap.LdapClient.search(LdapClient.java:504)
at com.sun.jndi.ldap.LdapCtx.doSearch(LdapCtx.java:1962)
... 26 more
4

4 に答える 4

2

JNDI 接続プーリングを有効にするだけで、バックグラウンドですべて処理されます。JNDI Guide to Features および LDAP プロバイダーのドキュメントを参照してください。いくつかのプロパティによって制御されます。

于 2013-08-04T00:56:27.323 に答える
0

私たちは仕事でこの問題を抱えていました。私たちが思いついた解決策 (最良の答えではないかもしれません)。固定レートで接続をチェックするウォッチドッグ スレッドを作成することでした。接続が機能しない場合、LDAP との接続が再初期化されます。

于 2013-08-03T18:17:53.647 に答える
0

UnboundID LDAP SDKは、自動再接続操作がクライアントから見えない自動接続の手段を提供します。

于 2012-01-09T13:55:25.267 に答える
-1

これは基本的にLDAP接続プーリングに関連していることに注意してください。ここで定義されているように:

接続はプールから取得され、使用され、プールに戻されてから、別のContextインスタンスのためにプールから再度取得されます。

したがって、以前の接続を再利用すると、次のような問題が発生する可能性があります。

設定することにより、LDAP接続プールを使用せずに動作をテストできます

com.sun.jndi.ldap.connect.pool=false

また、別の考えられる原因は、LDAP操作の読み取りのタイムアウトである可能性があります。実際、読み取り操作は、特定のタイムアウト後のLDAPサーバーのクローズについて通知されません。詳細については、このリンクをご覧ください。

于 2013-02-11T14:40:04.327 に答える