场景描述
在生产环境通过JDBC连接oracle数据库,80%的几率会出现以下异常:
JDBC SSL Connection Fails With SEVERE: IO Error: Connection Reset By Peer, Connect Lapse 1 Ms., Authentication Lapse 0 Ms. (Doc ID 2747530.1)
The Network Adapter could not establish the connection
是有时候没问题,有时候有问题。
服务器配置:
ARM 架构服务器,麒麟操作系统。
解决
根据 Connection Reset By Peer, Connect Lapse 1 Ms., Authentication Lapse 0 Ms
搜索的各种解决方法,都没有办法解决。
以下是无效参考:
https://www.technewstoday.com/connection-reset-by-peer/
https://support.oracle.com/knowledge/Middleware/2747530_1.html#FIX
https://docs.oracle.com/cd/E13209_01/wlcp/wlss30/configwlss/jvmrand.html
排除法
对linux不深入,oracle不深入实在是没有办法了,在测试环境(x86),经过多次测试,没有出现任何问题。排除是代码的问题。
初步可能:
1、服务架构问题,X86与ARM差异
2、Oracle服务器问题
3、OJDBC版本问题
4、网络偶尔连接得上,偶尔连接不上。可能是网络的连接问题。
排查:
2、其他客户端连接oracle,没有出现异常,排除oracle服务器问题。
3、相同配置,连接都没有问题,排除。
4、网络问题
搜素The Network Adapter could not establish the connection
,找到https://blog.csdn.net/jycjyc/article/details/118196814 ,分析挺有可能。修改配置,没有再出现问题。
参考:https://www.cnblogs.com/leafarmyarmy/p/12262907.html
解决方法
在 IPv4/IPv6 双环境中,对于使用 Java 开发的网络应用,比较值得注意的是以下两个 IPv6 相关的 Java 虚拟机系统属性。
java.net.preferIPv4Stack=<true|false>
java.net.preferIPv6Addresses=<true|false>
preferIPv4Stack(默 认 false)表示如果存在 IPv4 和 IPv6 双栈,Java 程序是否优先使用 IPv4 套接字。默认值是优先使用 IPv6 套接字,因为 IPv6 套接字可以与对应的 IPv4 或 IPv6 主机进行对话;相反如果优先使用 IPv4,则只不能与 IPv6 主机进行通信。
preferIPv6Addresses(默认 false)表示在查询本地或远端 IP 地址时,如果存在 IPv4 和 IPv6 双地址,Java 程序是否优先返回 IPv6 地址。Java 默认返回 IPv4 地址主要是为了向后兼容,以支持旧有的 IPv4 验证逻辑,以及旧有的仅支持 IPv4 地址的服务。
JVM增加参数:
-Djava.net.preferIPv4Stack=true