具體原因及解決方法:
ORA-04031出現的問題有以下幾個可能性:
1. 沒有綁定編量造成shared_pool碎片過多,同時shared_pool_size太小
(1)這個情況是比較常見的。
(2)第二種情況通常會建議使用綁定變量,或者用簡單的加大shared_pool,臨時的解決方法就是alter system flush shared_pool。
2. Large_pool,java_pool太小造成的
(1)這個通過錯誤信息的提示很容易判斷(Ora-04031 cannot allocate .. memeory in [large_pool])
(2)解決方法就是簡單的加大 Large_pool or Java_pool
3. 過度的開CURSOR而不關閉。
目前,此問題發生的越來越多,特別是在JAVA的運行環境中,屢見不鮮。加大Shared_pool或者flush shared_pool往往只能延遲問題出現的時間,而無法避免此問題。
判斷方法:
|
假如出來的值特大(以萬為單位)時,基本就可以確定是這個原因了。
解決這個問題的方法就是檢查程序,看是否沒有正常的關閉cursor(對于JAVA來說,就是沒有關閉Statement)?;蛘遱elect sql_text from v$open_cursor,看看都是哪些cursor沒關閉,再去檢查車程序。
也有的程序使用了保持一定量的cursor一直open,從而避免cursor過多次的開啟,來提高性能。對于這種情況,則應該選擇適當的shared_pool_size和控制keep_opening的cursor的量。
另外,Oracle參數session_cached_cursors也有可能過大,解決的方法就是把它降低到適當的值。
新聞熱點
疑難解答