Oracle-11g-R2

ORA-12516 但 max_utilization 未達到限制

  • May 11, 2015

我們的應用程序開始ORA-12516, TNS:listener could not find available handler with matching protocol stack出現錯誤,我正在嘗試診斷原因。

工作量沒有改變,所以我認為我們可能在應用程式碼中引入了一個錯誤,但我不明白為什麼。最明顯的是連接洩漏或未關閉的空閒事務,但是:

  1. 我們正在使用 jdbc 池(tomcat-jdbc-pool),最大活動值為 73,低於 Oracle 配置使用的 150 個程序。所以我會認為池會在 Oracle 達到自己的限制之前拋出錯誤。
  2. 這樣做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 數據包的連接。

然後下一個查詢以新建立的連接開始。現在,只要負載保持在低水平,您甚至可能都不會注意到這一點。但是在高負載下,所有這些重新連接都必須耗盡一些數據庫資源。哪一個,我不知道…

引用自:https://dba.stackexchange.com/questions/63539