断続的なORA-12519(TNS:適切なハンドラが見つかりません)エラーの原因

StackOverflow https://stackoverflow.com/questions/205160

質問

Oracle 10データベースの前でWeblogic 9に対してJunit 4テストスイートを実行しており(Hudsonを継続的統合サーバーとして使用)、スクリプトの分解中にORA-12519クラッシュが発生することがあります。ただし、エラーは非常に断続的です:

  • 通常、同じテストクラスで発生します
  • 同じテストケースで常に発生するとは限りません(パスする場合もあります)
  • 同じ数のテストケースでは発生しません(3〜9のいずれか)
  • まったく起こらないこともありますが、すべてが成功します

これがローカルで発生しないことは保証できませんが(もちろん、同じデータベースに対して実行する場合)、同じクラスのスイートを問題なく複数回実行しました。

アイデアはありますか

役に立ちましたか?

解決

これがすべての人の答えになるかどうかはわかりませんが、掘り下げた後、ここに私たちが思いついたものがあります。

エラーは明らかにリスナーが接続を受け入れていなかったという事実によって引き起こされますが、他のテストで問題なく接続できる場合にエラーが発生するのはなぜですか(sqlplusでも問題なく接続できます)?問題の鍵は、接続できなかったことではなく、断続的

でした

調査の結果、クラスのセットアップ中に作成された静的データがあり、テストクラスの存続期間中は接続を開いたままにして、新しいデータを作成しました。現在、このクラスがスコープから外れると(もちろん、finally {}ブロックを介して)すべてのリソースが適切に解放されましたが、実行中にこのクラスが使用可能なすべての接続を飲み込む場合がありました(大丈夫、悪いプラクティスアラート-これはプールを使用するのではなく直接接続されたユニットテストコードであったため、本番環境では同じ問題は発生しませんでした。

修正は、そのクラスを静的にせずにクラスのセットアップで実行するのではなく、メソッドごとのsetUpメソッドとtearDownメソッドで使用することでした。

したがって、自分のアプリでこのエラーが発生した場合は、その悪い男の子にプロファイラーを叩き、接続リークがあるかどうかを確認してください。お役に立てば幸いです。

他のヒント

同様のエラーを見つけた別の解決策ですが、同じエラーメッセージは、見つかったサービスハンドラの数を増やすことです。 (このエラーの私のインスタンスは、Weblogic Portal接続プールの接続が多すぎることが原因でした。)

  • SQL * Plus を実行し、 SYSTEM としてログインします。 Oracle DB XEのインストール中に使用したパスワードを知っている必要があります。
  • SQL * Plusでコマンド alter system set processes = 150 scope = spfile; を実行します
  • 非常に重要:データベースを再起動します。

ここから:

  

http:// www.atpeaz.com/index.php/2010/fixing-the-ora-12519-tnsno-appropriate-service-handler-found-error/

私も同じ問題を抱えていました。多くの場所で答えを探しました。プロセス/サービスハンドラの数を変更するために、多くの同様の回答を得ました。しかし、私はそれをリセットするのを忘れたらどうしたらいいと思いましたか

次に、各 connection.close(); の後に Thread.sleep()メソッドを使用してみました。

方法はわかりませんが、少なくとも私にとっては機能しています。

誰かがそれを試して、それがどのように機能するかを知りたいなら、先に進んでください。プログラミングの初心者でもあるので、それを知りたいです。

同様の問題がありました。 SpringJUnit4ClassRunner でデータベース(Spring JDBC)テストのパックを実行するたびに発生したため、アプリケーションコンテキストとすべてのリソースを解放するため、各テストはアプリケーションコンテキストの新しい初期化で実行できます。

接続プールを介してDBへの多くの接続を開き、「停止」したユニットテストでこの問題が発生しました。各テストの終了時に接続を解放する接続プール(実際にはManageddDataSource)。テストスイートのある時点で、常に接続が不足していました。

テストのteardown()にThread.sleep(500)を追加して、問題を解決しました。起こっていたことは、接続プールのstop()が別のスレッドのアクティブな接続を解放し、メインスレッドがテストを実行し続けると、クリーンアップスレッドがはるかに遅れてOracleサーバーが接続を使い果たしたためだと思います。スリープを追加すると、バックグラウンドスレッドがプールされた接続を解放できます。

DBサーバーははるかに大きく、操作の健全な組み合わせがあるため(現実的なDB接続/切断操作だけでなく)、これは現実の世界でははるかに問題ではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top