2017-08-28 8 views
0

私はTomcat接続プールとOracleデータベースを持つ春のブートアプリケーションを持っています。 それは7 * 24hのために働き、多分接続は常に存在し、働くかもしれません。 Oracleの一時的な増加がますます大きくなっています。アプリを停止した後は、ファイルサイズではなく、リカバリやリカバリはできません。 一時ファイルは32GBで、まだ十分ではありません。 どうすればいいですか?毎日アプリを再起動しますか?なぜオラクルは一時的に大きくなっていますか?

オラクルのスナップショット:

oracle snapshot

` 
MERGE INTO TABLE_ABC 
USING 
(SELECT 
    1000000035432496 AS "ID", 
    1000000035432496 AS "BID", 
    sysdate AS "UpdateTime", 
    sysdate AS "EntryTime", 
    '2017-08-08' AS "AAA", 
    'ABCDEFG' AS "BBB" 
FROM DUAL) T 
ON (TABLE_ABC.ID=T.ID) 
WHEN MATCHED THEN 
UPDATE 
    SET BID=T."BID", 
    UPDATETIME=T."UpdateTime", 
    ENTRYTIME=T."EntryTime", 
    AAA=T."AAA", 
    BBB=T."BBB" 
WHEN NOT MATCHED THEN 
    INSERT (ID,BID,UPDATETIME,ENTRYTIME, AAA, BBB) 
    VALUES(T."ID",T."BID",T."UpdateTime",T."EntryTime",T."AAA", T."BBB") 
` 
+1

一時的なロブがセッションのどこかに漏れています。毎回セッションを再起動したくない場合は、SQL文をトレースし、漏れの疑いのあるものをリグにテストする必要があります。 – wolfrevokcats

+0

"select 1 from dual"は接続プールの検証クエリをチェックすることです。私は "MERGE INTO" SQLを使用してデータを挿入または更新します。問題はありますか? – Roy

+0

一時的なロブを利用するいくつかのsqlsがセッションで実行されています。 'Select one from dual'は問題に関連していません。 'Merge into'ステートメント自体は問題ではありません。一時的なロブを直接的または間接的に使用している場合は、その可能性があります。 – wolfrevokcats

答えて

0

は悪いアーキテクチャ上のすべてのコメントに同意します。

あなたはLOBを使用して主張する場合、漏れがすることによって最小化することができます:ロブは、あなたがしているときに、新しい1

if not (DBMS_LOB.ISOPEN(v_blob)) then 
    DBMS_lob.createtemporary(v_blob,true); 
    end if; 

dbms_lob.freeTemporary; 

を作成する前に存在しているかどうかをチェックする追加

ロブを使用して終了しました。

明らかに、アプリがロブにアクセスする方法によって異なります。それを使用した後にロブ(ハンドル)を閉じることを忘れないでください。

+0

あなたの答えをありがとうが、私は非常によく理解できません。私のアプリでは、いくつかのテーブルにclobまたはblob fieldsがあります。たぶんそれはロブを使用しています。そして、私は "MERGE INTO" SQLを使用して挿入するか、行を更新する。私のアプリは、マルチスレッドhttp request.Soでテーブルを転送するためのツールです。各行にSQLの数が多くなります。接続が保留されています。しかし、アプリケーションが停止した後で一時的に非常に大きなものがあることがあります。 – Roy

+0

私の経験では、dbms_lob.freeTemporaryが実行されていないと、temp segは解放されません。他のすべての用途では、アプリケーションが終了すると、oracleはtempを解放します。 GTTと大規模な種類。大量のSQLはtempを使用することがありますが、それを解放する必要があります。あなたがMERGEステートメントを残しておかないと、それ以上助けにならない。 – sandman

関連する問題