近日公司軟件應用客戶端連接數據庫時不時出現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/,裡面有大量的文檔,自己以後多學習。
閱讀更多 楊建榮的學習筆記 的文章