4

Oracle データベースに接続された複数の接続にまたがる XA データソースとトランザクションを使用する JDBC ベースのアプリケーションがあります。アプリは、共有 DbLink を使用して別の (Oracle) サーバーからのテーブルとの結合を使用して、いくつかのクエリを実行する必要がある場合があります。あまり頻繁に行わなければリクエストは機能しますが、4 つまたは 5 つのリクエストを立て続けに行うと、エラー (ORA-02020 - 使用中のリンクが多すぎます) が発生します。私はいくつかの調査を行いましたが、提案された解決策は「ALTER SESSION CLOSE DATABASE LINK」を呼び出すことです。DbLnk テーブルを結合するクエリの後にこのリクエストを呼び出すと、エラー ORA-2080 (リンクが使用中) が発生します。クエリの前に呼び出すと、ORA-2081 (リンクが閉じられました) が発生します。この呼び出しはまったく役に立ちますか? JDBC 接続は、トランザクションのコミット (サーブレットまたは EJB コンテナーのいずれかによって管理される) のかなり前に閉じられます。場合によります)。接続が閉じると、Oracle はリンクを閉じたものとしてマークしますが、使用可能なリンクのプールに戻るまでに 1 ~ 2 分かかるという印象を受けます。(構成ファイルの open_links プロパティを使用して) リンクのプールを拡大できることは理解していますが、より重い負荷の下で同じ問題が発生しないという保証はありません。dblinks をより迅速に閉じるために別の方法でできることはありますか?

4

1 に答える 1

2

分散 SQL は、select であっても、データベース リンクを閉じる前に閉じる必要があるトランザクションを開きます。ALTER SESSION CLOSE DATABASE LINK を呼び出す前に、ロールバックまたはコミットする必要があります。

しかし、トランザクションを処理する何かがすでにあるようです。手動でロールバックまたはコミットできない場合は、開いているリンクの数を増やしてみてください。OPEN_LINKSパラメータは、セッションごとのリンクの最大数です。必要なリンクの数は負荷に実際には依存しません。個別のリモート データベースの最大数に基づく必要があります。

編集:

コメントで説明した状況は発生しないはずです。あなたのシステムについて十分に理解していないため、トランザクションで実際に何が起こっているのかを知ることができません。とにかく、システムが何をしているのか正確に把握できない場合は、「セッションを閉じるデータベースリンクを変更する」を次のような手順に置き換えることができます。

create or replace procedure rollback_and_close_db_links authid current_user is
begin
    rollback;
    for links in (select db_link from v$dblink) loop
        execute immediate 'alter session close database link '||links.db_link;
    end loop;
end;
/

おそらくこの助成金が必要になるでしょう:

grant select on v_$dblink to [relevant user];
于 2011-02-25T05:53:05.117 に答える