Oracle-11g-R2
ORA-12516 但 max_utilization 未達到限制
我們的應用程序開始
ORA-12516, TNS:listener could not find available handler with matching protocol stack
出現錯誤,我正在嘗試診斷原因。工作量沒有改變,所以我認為我們可能在應用程式碼中引入了一個錯誤,但我不明白為什麼。最明顯的是連接洩漏或未關閉的空閒事務,但是:
- 我們正在使用 jdbc 池(tomcat-jdbc-pool),最大活動值為 73,低於 Oracle 配置使用的 150 個程序。所以我會認為池會在 Oracle 達到自己的限制之前拋出錯誤。
- 這樣做
select * from gv$resource_limit;
是我得到的:NST_ID RESOURCE_NAME CURRENT_UTILIZATION MAX_UTILIZATION INITIAL_ALLOCATION LIMIT_VALUE ---------- ------------------------------ ------------------- --------------- ------------------ ----------- 1 processes 32 40 150 150 1 sessions 32 45 248 248 ...
因此,似乎最大使用率從未達到極限。
有沒有人有關於如何追踪這個的提示?
編輯:我在這方面取得了一些進展。事實證明,tomcat-jdbc-pool 有一個查詢來檢查連接的健康狀況。此查詢配置為
select 1 from dual;
。注意半列,因為這是罪魁禍首:刪除它會修復應用程序。我仍然需要弄清楚 ; 到底發生了什麼。在檢查查詢結束時。歡迎任何建議。
我認為
select 1 from dual;
是語法錯誤。這是電線上發生的事情:連接
select 1 from dual
的生命週期是:
- 初期成立
- 第一個查詢(驗證尚未發生)
- 返回游泳池
- 驗證:池發送
select 1 from dual
- 數據庫回答:
ORA-01403: no data found
- 下一個查詢
等等。連接通常不會關閉。
但是,
select 1 from dual;
會發生以下情況:
- 初期成立
- 第一次查詢
- 返回游泳池
- 驗證:池發送
select 1 from dual;
- 數據庫回答:
ORA-00911: invalid character
- 池終止與正常 FIN 數據包的連接。
然後下一個查詢以新建立的連接開始。現在,只要負載保持在低水平,您甚至可能都不會注意到這一點。但是在高負載下,所有這些重新連接都必須耗盡一些數據庫資源。哪一個,我不知道…