0

jsp からストアド プロシージャを呼び出す tomcat サーバーがあります。ストアド プロシージャには、一時テーブルにデータを入力するクエリがあります。その一時テーブルは、dblink を介して別のテーブルに結合され、ヒント - を使用して別の一時テーブルを埋めますDRIVING_SITE。次に、最後の一時テーブルがデータベースの別のテーブルに結合され、結果セットが tomcat に返されます。

申し訳ありませんが、これらすべてのコード例を実際に提供することはできませんが、私が抱えている問題は次のとおりです。エラーを返します:

test.jsp caught exception, closing connection: ORA-02068: following severe error from DATABASE_LINK_NAME
ORA-03135: connection lost contact

最後の呼び出しから 10 分程度以内にデータベース リンクで行われた後続のすべてのクエリは問題ありません。一時テーブルは大きくても小さくてもかまいません。クエリされるデータの量に違いはないようですが、アイドル時間後の最初の呼び出しでは、おそらく 75% の確率でこのエラーが発生します。誰もこの問題を経験しましたか? もしそうなら、解決策はありますか?

クエリは次のように構成されています。

INSERT INTO temp_table_2
WITH last_submissions AS (
    SELECT /*+ DRIVING_SITE(some_schema.some_table_1) */
           bs.unique_id,
           CASE WHEN COUNT(bs.unique_id) > 1 THEN 'Y' ELSE 'N' END some_flag,
           MAX(trx.unique_id) last_submission
    FROM   (SELECT unique_id
            FROM   temp_table_1) oids,
           some_schema.some_table_1@DATABASE_LINK bs,
           some_schema.some_table_1@DATABASE_LINK trx
    WHERE  oids.unique_id = bs.unique_id
      AND  bs.non_unique_join_id = trx.non_unique_join_id
    GROUP BY bs.unique_id),
something_relevant AS (
    SELECT /*+ DRIVING_SITE(some_schema.some_table_2) */
           last_value_of_something.unique_id,
           last_value_of_something.some_flag,
           mv.value_description status
    FROM   (
        SELECT /*+ DRIVING_SITE(some_schema.some_table_1) */
               ls.unique_id,
               CASE WHEN COUNT(ls.unique_id) > 1 THEN 'Y' ELSE 'N' END some_flag,
               MAX(prd.prd_some_id) last_submission
        FROM   last_submissions ls,
               some_schema.some_table_1@DATABASE_LINK trx,
               some_schema.some_table_2@DATABASE_LINK prd
        WHERE  ls.last_submission = trx.unique_id
          AND  trx.some_unique_id = prd.some_unique_id (+)
        GROUP BY ls.unique_id) last_value_of_something,
        some_schema.some_table_2@DATABASE_LINK prd,
        some_schema.some_table_3@DATABASE_LINK cs,
        some_schema.some_display_value_table@DATABASE_LINK mv
    WHERE  last_value_of_something.last_submission = prd.prd_some_id (+)
      AND  prd.some_id = cs.some_id (+)
      AND  cs.status_code = mv.value (+)
      AND  mv.value_type (+) = 'SOME_INDICATOR_FOR_DISPLAY_VALUES')
SELECT ls.unique_id unique_id,
       NVL(pr.status, trx.some_code) status,
       CASE WHEN ls.some_flag = 'Y' OR pr.some_flag = 'Y' THEN 'Yes' ELSE 'No' END display_the_flag
FROM   /*+ DRIVING_SITE(some_schema.some_table_1) */
       last_submissions ls,
       some_schema.some_table_1@DATABASE_LINK trx,
       something_relevant pr
WHERE  ls.last_submission = trx.unique_id
  AND  ls.unique_id = pr.unique_id
4

1 に答える 1

2

2 つのデータベース サーバー間のネットワークが安定しており、しばらくの間接続が維持されると思いますか?

データベース リンクを使用すると、ローカル サーバーがリモート サーバーへの接続を開きます。その接続は、セッションが他のクエリで使用できるように開いている限り、開いたままになります。接続が切断されている場合は、多くの場合、アイドル状態の接続を検出して強制終了している何か (通常はファイアウォール) がネットワーク内にあることを意味します。また、2 つのサーバー間のネットワークが単に不安定であることを意味する場合もあります。

理想的には、根底にあるネットワークの問題を修正することで問題を解決します。アイドル状態の接続を強制終了しているファイアウォールがある場合は、ファイアウォールの構成を変更して、たとえばこれらの接続を強制終了しないようにする必要があります。

インフラストラクチャを修正できない場合は、すべてのクエリの後で (または少なくとも長いアイドル時間が続く可能性があるすべてのクエリの後に)、リモート サーバーへの接続を閉じることができます。

ALTER SESSION CLOSE DATABASE LINK <<dblink name>>

ただし、これは、潜在的にすべてのクエリでリモート サーバーへの接続をセットアップおよび切断することになることを意味します。発生する可能性のあるセッションの数)。

Web アプリケーションを使用して人間にデータを提供するために、データベース リンクを介して一連の一時テーブルにデータをプルするプロセス全体も、潜在的に問題のあるアーキテクチャのように思えます。おそらく、これには正当な理由があります。しかし、実行時にデータベース リンクを介してデータをプルするのではなく、ある種のレプリケーション テクノロジ (マテリアライズド ビュー、ストリーム、またはゴールデンゲートが組み込みのオプションです) を使用することを強く検討します。

于 2013-10-07T22:48:37.590 に答える