某种场景下,JDBC连oracle控制台sql error 17002 sqlstate 08006的解决

本文详细记录了一位工程师在CentOS7.9环境下,Tomcat连接Oracle数据库遇到的sqlerror17002sqlstate08006错误的排查过程。通过修改配置、检查网络、DNS解析等多个步骤,最终发现由于DNS配置导致的连接延迟问题,并通过移除DNS配置解决了问题。该案例对于遇到类似问题的开发者具有一定的参考价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之所以加“某种场景下”是因为网络能搜索到这个问题的结果太多了,但无一解决我的问题。

故障环境:CentOS7.9+Tomcat、CentOS+Oracle11g

故障现象:Tomcat启动以后jdbc有时候连不上oracle,报sql error 17002 sqlstate 08006,有时候还能连接上,给应用服务器换个IP地址就能连上一次,重启几次jdbc又连不上,Oracle SQL Developer一切正常,其实jdbc连上的时候,初次访问应用也是很慢,观察tomcat控制台的日志滚动情况,很慢,显得系统在吃力的读取...

调试过程:

1.修改了listener.ora和tnsname.ora的HOST,改成ip以后不但jdbc连不上Oracle SQL Developer也连不上了,最终还是恢复为系统默认机器名localhost.localdomain

2.由于使用的是VMWare虚拟服务器,怀疑管理员分配的设备mac有问题,于是分别去两个服务器看了mac,然后在两个服务器上执行arp -a,发现获得的mac是正确的

3.有百度结果是ipv6可能影响,于是删除了网卡配置文件的ipv6配置,停用了ipv6服务

4.上述无结果,再分析——应该还是数据库的返回错误,并不像网络不通的问题,于是把jdbc连接的oracle服务器地址改为随便一个地址,返回的错误是无法建立连接

5.换了jdbc驱动,用ojdbc14,ojdbc8都没有改善,于是恢复ojdbc6

6.查看oracle服务器的listener.log,有如下异常信息,看起来是找不到SID

26-MAY-2021 11:39:00 * (CONNECT_DATA=(SID=orcl)(CID=(PROGRAM=JDBC Thin Client)(HOST=__jdbc__)(USER=root))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.5.5.43)(PORT=49690)) * establish * orcl * 12505
TNS-12505: TNS:listener does not currently know of SID given in connect descriptor
26-MAY-2021 11:39:00 * (CONNECT_DATA=(SID=orcl)(CID=(PROGRAM=JDBC Thin Client)(HOST=__jdbc__)(USER=root))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.5.5.43)(PORT=49692)) * establish * orcl * 12505
TNS-12505: TNS:listener does not currently know of SID given in connect descriptor

7.由于listener.ora和tnsname.ora没有监听sid,所以按:监听服务名的方式,以表示服务名的连接字符串格式 database.url=jdbc:oracle:thin:@192.xxx.9.xx:1521/orcl的格式修改了连接字符串,问题依旧,于是按照Oracle SQL Developer的连接字符串又改成了jdbc:oracle:thin://@192.xxx.9.xx:1521/orcl,问题依旧

8.这时候再看listener.log,没再有报错,日志体现如下内容:

26-MAY-2021 17:00:09 * (CONNECT_DATA=(CID=(PROGRAM=JDBC Thin Client)(HOST=__jdbc__)(USER=root))(SERVICE_NAME=orcl)(CID=(PROGRAM=JDBC Thin Client)(HOST=__jdbc__)(USER=root))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.5.5.43)(PORT=48094)) * establish * orcl * 0
26-MAY-2021 17:00:09 * (CONNECT_DATA=(CID=(PROGRAM=JDBC Thin Client)(HOST=__jdbc__)(USER=root))(SERVICE_NAME=orcl)(CID=(PROGRAM=JDBC Thin Client)(HOST=__jdbc__)(USER=root))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.5.5.43)(PORT=48096)) * establish * orcl * 0
26-MAY-2021 17:00:14 * (CONNECT_DATA=(CID=(PROGRAM=JDBC Thin Client)(HOST=__jdbc__)(USER=root))(SERVICE_NAME=orcl)(CID=(PROGRAM=JDBC Thin Client)(HOST=__jdbc__)(USER=root))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.5.5.43)(PORT=48098)) * establish * orcl * 0

这么看来连接是建立的,但是应用不正常,控制台仍有“sql error 17002 sqlstate 08006”

9.一直没有改lisnter.ora和tnsnames.ora,原因是对比了现有的正常状态服务器,并无太大区别

10.确认CentOS的firewalld关闭和selinux关闭

问题解决:

首先应该感谢 https://blog.csdn.net/evilcry2012/article/details/45534207/ 这篇文的作者,这篇文对我启发比较大,文章内容非常专业!

我一直倾向于问题出现在网络上,想着这个HOST的解析是怎么拿到的,如果HOST是IP地址,那没什么考虑的,同网段IP直连,没有网关、路由和安全设备影响。

起初是有想法要改oracle服务器机器名,重新定义HOST,然后把oracle服务器机器名写到tomcat所在服务器的host里,但是觉得这么很麻烦,而且以前也从来没有这么配置过,不应该是这么做的。

于是想到了服务器对host的解析,那么服务器有可能会去找自己的dns(这个oracle的jdbc究竟是个什么流程我也没渠道了解到),于是看了一下服务器的dns,服务器是关闭互联网访问的,由于之前yum update过系统所以dns的配置还是在的

这时候另外一个发现是tomcat启动时,控制台有较长停顿,经过测试,那个停顿是在连接数据库,而实际上应用服务器直接ping服务器的ip地址和telnet数据库服务器的1521端口是没有任何延迟的,那么这个卡顿有可能是在做解析。

最终去系统的网卡配置文件里删除了dns配置,重启网络以后,再启动tomcat,卡顿消失,访问正常。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值