ORA-01000: 最大オープン カーソルの超過または DB 接続を作成できませんなど、さまざまなデータベース エラーとして表示される問題のトラブルシューティングを試みています。PLSQL を確認して、カーソルが開いたままになっていて、エラーがあってもすべて閉じているかどうかを確認しました。
Java アプリケーションと背景は次のとおりです。 元のアプリケーションは 3 層システムでした。
GUI アプリ。-> サーバーアプリ -> 11g Oracle データベース
機能強化は、Pivotal Cloud Foundry (PCF) 環境に API サービスを追加することでした。したがって、このアーキテクチャは次のようになりました。
関数を閉じる: GUI アプリ -> サーバー アプリ -> API サービス -> データベース。
他のすべての機能: GUI アプリ -> サーバー アプリ -> データベース。
これは本番環境に置かれ、上記のデータベースの問題なしで 1 週間実行されました。次に、API サービスが他のいくつかのサービスとすべて PCF で通信する別の拡張機能が追加されました。2 つのサービスは同じ Oracle データベースと通信します。現在、大量のボリュームが発生しているときに、これらのデータベース エラーが発生しています。
Oracle データベースは、これらの追加サービスからの要求に対応できないように思われます。しかし、どうすればそれを証明できますか。サーバー用に AppD を構成しましたが、データベース用には構成しませんでした。製品環境で実行できるクエリはありますか。これらの PCF アプリケーションが問題を引き起こしていることを示していますか? それとも、別の分野を見た方がいいですか?
ありがとう、
更新 レガシーアプリケーションを調べたところ、結果セットは閉じられています。他の 3 つの PCF アプリケーションは、Spring Boot を使用してデータベースに接続します。私の理解では、接続と結果セットを閉じることは、明示的に閉じる必要はありません。JDBCTemplate は、これらの接続/結果セットを閉じます。追加された PLSQL には、成功と例外で閉じられる追加のカーソルがあります。
更新 セッションIDごとに開いているカーソルの合計を表示するクエリを作成しましたこれはクエリです:
select b.sid, b.username, b.osuser, sum(a.value) total_opened_current_cursors
from sys.v_$statname c,
sys.v_$sesstat a,
sys.v_$session b
where a.statistic#=c.statistic# and
b.sid=a.sid and
c.name in ('opened cursors current') and
(b.username is not null or b.username <> '' )
group by b.sid, b.username, b.osuser
order by total_opened_current_cursors desc
ここで、sessionID をこのセッションを持つアプリケーションにリンクする必要があります。上位のもののosuserは NULL です。また、ほとんどのセッションのステータスはINACTIVE です セッションへのアプリケーションを識別する方法は? 第二に、セッションは非アクティブです。これは、クエリが発生していないことを意味すると思いましたが、開いているカーソルがあるのはなぜですか?
**UPDATE**
そこで、開いているカーソルが最も多い上位 10 件のセッションを返すクエリを作成しました。
select *
FROM
(
select b.sid, b.username, b.osuser, b.status, sum(a.value) total_opened_current_cursors
from sys.v_$statname c,
sys.v_$sesstat a,
sys.v_$session b
where a.statistic#=c.statistic# and
b.sid=a.sid and
c.name in ('opened cursors current') and
(b.username is not null or b.username <> '' )
group by b.sid, b.username, b.osuser, b.status
order by total_opened_current_cursors desc
)
WHERE ROWNUM <= 10;
開いているカーソルのほとんどを占めている SQL_TEXT を見つけました...圧倒的に! (87%) では、この SQL を呼び出すクエリを見つけるにはどうすればよいでしょうか? データベースにヒットするサービスが少なくとも 5 つあります。一部のサービスは PLSQL ストアド プロシージャを呼び出し、一部のサービスは生の SQL テキストを呼び出します。開いているカーソルを説明するクエリは、SELECTステートメントとしてリストされます。それはストアドプロシージャではないということですか?または、このSELECTをストアド プロシージャ内で呼び出すことができます。
このセッションを使用する接続を見つけるにはどうすればよいですか?