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