来自路勇同学投稿,在此感谢。
作者:路勇 南京恩瑞特有限公司
近日公司软件应用客户端连接数据库时不时出现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/,里面有大量的文档,自己以后多学习。