2017-08-28 143 views
0

我有一個tomcat連接池和oracle數據庫的spring啓動應用程序。 它工作7 * 24小時,也許連接總是存在和工作。 Oracle臨時增加越來越大。似乎無法減少或恢復。停止應用程序後,僅減少已用空間而非文件大小。 現在臨時文件是32GB,仍然不夠。 我現在應該做什麼?每天重新啓動應用程序?爲什麼oracle臨時越來越大?

甲骨文快照:

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

「從雙選擇1」是檢查連接池中的驗證查詢。我使用「MERGE INTO」sql來插入或更新數據。是這樣的問題嗎? – Roy

+0

會議中有一些sqls正在運行,它們使用臨時的lobs。 '從雙重選擇1'與問題無關。 「融入」聲明本身不是問題。如果它直接或間接地使用臨時性的lob。 – wolfrevokcats

回答

0

同意壞架構的所有評論。

添加檢查,如果吊射創建一個新的

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

dbms_lob.freeTemporary; 

當你是之前就存在:

如果你堅持用高吊球,泄漏可以通過最小化完成使用吊球。

這顯然取決於您的應用程序如何訪問高球。請記住在使用後關閉吊杆(手柄)。

+0

感謝您的回答,但我無法理解。我的應用程序中有一些表與clob或blob fields.So也許它使用lobs。我使用「MERGE INTO」sql來插入或更新rows.My應用程序是一個用多線程http請求傳輸表的工具。所以它會爲每一行創建大量的sql。我猜oracle在jdbc時不能臨時減少連接處於暫停狀態。但有時應用程序停止後,暫時仍然非常大。 – Roy

+0

根據我的經驗,如果dbms_lob.freeTemporary沒有完成,temp seg就不會被釋放。在臨時seg的所有其他用途中,如果應用程序關閉,例如,oracle會釋放temp。 GTT和大類。大量的SQL可能會使用temp,但應該釋放它。除非您貼上MERGE聲明,否則我們無法進一步提供幫助。 – sandman