ORA-12560 問題的分析

近日公司軟件應用客戶端連接數據庫時不時出現ORA-12560錯誤,通過PL/SQL工具、NetManager工具測試連接數據服務器都正常,上網查找ORA-12560方法解決嘗試以後都沒有成功,自己以前從來不會寫記錄,但是希望遇到類似問題的朋友不要像我一樣很茫然。

應用客戶端系統Win7,數據庫版本Oracle(11.2.0),應用開發語言C,以下是分析步驟:

1. 在sqlnet.ora文件中開啟日誌記錄功能

文件位置,”D:\\app\\lenovo\\product\\11.2.0\\client_1\\network\\admin”,根據自己按照路徑獲取修改。

在文件中加入以下內容:

Trace_level_client=16

Trace_directory_client=D:\\OracleLog

Trace_unique_client=on

Trace_timestamp_client=on

Diag_adr_enabled=off

tnsping.trace_directory=D:\\OracleLog

tnsping.trace_level=admin

日誌會在OracleLog文件中產生。

2. 分析OracleLog日誌

產生ORA-12560日誌如下:

connection refused - trying again in 16 seconds.

TCP連接拒絕,查找了相關資料,剛開始懷疑係統端口不夠或者過多的TIME_WAIT連接造成的,修改了TCP註冊表參數以後還是沒有解決。

nserror: nsres: id=0, op=65, ns=12560, ns2=0; nt[0]=530, nt[1]=55, nt[2]=0; ora[0]=0, ora[1]=0, ora[2]=0

這句日誌分析,查找了Oracle文檔,沒有找到nserror: nsres參數字段意思,自己只有慢慢異想天開,突然間nt[1]=55,這個字段55讓我搖擺不定,55難道是系統錯誤碼或者TCP錯誤碼,自己查閱了系統錯誤碼或者TCP錯誤碼。

只有找到TCP錯誤碼有點類似,ENOBUFS (10055):無緩衝區空間可用。難道是應用進程內存洩漏或者內存資源不足引起的嗎?

3. 提交大小

通過任務管理器查看應用進程內存才14.7M,也不大啊,摸索了一天,打開性能監視器查看進程發現進程提交大小很大,是不是發現問題了,自己很興奮。

提交大小:1059kb

查閱資料提交大小=內存(專用工作集)+頁面緩存 ,但是進程顯示提交大小怎麼大,肯定是程序問題。

4. 如何解決

內存資源問題,肯定是代碼或者軟件架構問題,自己把整個工程中的變量聲明、宏定義、文件引用都重新規範化,把工程重新新建在添加,最後編譯通過運行,主要有:

1)開發工程規範化,合理使用.h和.c文件,編寫代碼不冗餘,每個文件代碼量合理控制。

2).變量聲明合理化,.c文件聲明變量,.h文件extern變量並加入宏控制頭文件多次引用,其它文件如果使用變量包含頭文件即可。

3).宏合理化使用,將工程中經常使用的數據定義成宏,可以提高程序效率。

進程提交大小變成46kb左右,在反反覆覆測試連接數據庫竟然沒有問題了,有的時候解決問題就是憑感覺。

5. 學習

通過今日分析問題,讓我知道了https://docs.oracle.com/en/,裡面有大量的文檔,自己以後多學習。


分享到:


相關文章: