错误信息:

--KStudio客户端工具错误信息
The conncetion attempt failed.Reason:connect time out --Java应用程序控制台日志
Caused by :java.net.SocketTimeoutException: connect time out
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)

问题现象:

Navicat客户端工具可以正常连接KingbaseES数据库,Navicat客户端工具连接数据库未使用jdbc驱动。而使用jdbc驱动的Java应用程序及KStudio客户端工具不能正常连接KingbaseES数据库。

排查过程:

同样是远程跨主机访问数据库,Navicat客户端工具连接数据库未使用jdbc驱动程序,可以正常连接KingbaseES数据库,说明问题原因跟网络和防火墙没有关系。

通过Java应用程序控制台日志发现客户端/应用程序在尝试使用IPv6,但是网络环境不支持IPv6,所以无法建立连接。

Caused by :java.net.SocketTimeoutException: connect time out
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)

通过以下网址得知,在使用VPN连接的环境部分VPN软件会导致Java应用jdbc驱动默认使用IPv6,不使用IPv4。

https://docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-Desktop/html/plugin.html

Network Configuration

In general, Java Web Start applications use the system network configuration by default, and applets use the browser network settings. You can set network proxies explicitly using Java Control Panel.

In particular, the Java technology networking layer automatically detects what networking stack to use. However, sometimes autodetection does not work and you may observe "Permission Denied" exceptions trying to open a socket to download your application or applet, even while the same URL is accessible using the same proxy settings with other tools. This problem was observed on some Windows 7 systems when VPN software is used. This can be resolved by explicitly passing a parameter to the JVM:

-Djava.net.preferIPv4Stack=true
See the section on how to pass parameters to JVM for details.

通过询问同事得知,连接有问题的环境确实有在使用VPN(Easy connect )软件。

在Java代码添加System.setProperty("java.net.preferIPv4Stack","true"); 添加后可以正常运行Java应用。

到此基本可以确定,问题出现原因主要就是由于使用VPN软件导致不能正常建立IPv6连接,Java程序又尝试使用IPv6导致。

可以通过显式设置jvm参数 -Djava.net.preferIPv4Stack=true,使Java应用程序优先使用IPv4来解决此问题。

解决方法:

在KStudio客户端工具配置文件kstudio.ini 加入 -Djava.net.preferIPv4Stack=true 问题解决。

Java应用程序解决方法:

  1. 禁用系统IPv6.

  2. 设置Java系统属性

    在Java应用程序代码里面添加 System.setProperty("java.net.preferIPv4Stack","true");
    使用java -jar 启动Java应用时,增加参数 -Djava.net.preferIPv4Stack=true
    设置环境变量_JPI_VM_OPTIONS和_JAVA_OPTIONS -Djava.net.preferIPv4Stack=true
    设置开发工具IDEA 的vm options -Djava.net.preferIPv4Stack=true
  3. 添加环境变量

    windows系统 set "JAVA_OPTS=%JAVA_OPTS% -Djava.net.preferIPv4Stack=true"
    Linux系统 export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"

关于参数 java.net.preferIPv4Stack

官方文档解释:

If IPv6 is available on the operating system, the underlying native socket will be an IPv6 socket. This allows Java applications to connect to, and accept connections from, both IPv4 and IPv6 hosts.

java.net.preferIPv4Stack=false

在支持IPv6的双栈系统上,使用Java的Socket会默认通过底层native方法创建一个IPv6 Socket,这个IPv6 Socket可以同时支持和IPv4或IPv6主机通信。

java.net.preferIPv4Stack=true

如果设置为true,Java程序将无法使用IPv6进行网络通信,也就是仅支持IPv4。通过IPv6访问就会访问不通。

通过以下代码获取默认优先使用IPv4还是IPv6

System.out.println(InetAddress.getByName("[www.aliyun.com](http://www.aliyun.com)"));

Java程序连接KingbaseES 异常的更多相关文章

  1. Core Java 总结(异常类问题)

    所有代码均在本地编译运行测试,环境为 Windows7 32位机器 + eclipse Mars.2 Release (4.5.2) 2016-10-17 整理 下面的代码输出结果是多少?为什么?并由 ...

  2. 【Java心得总结二】浅谈Java中的异常

    作为一个面向对象编程的程序员对于 下面的一句一定非常熟悉: try { // 代码块 } catch(Exception e) { // 异常处理 } finally { // 清理工作 } 就是面向 ...

  3. Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换

    Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换 { "@type":"java.lang.Runti ...

  4. 关于java中的异常问题 1

    1.首先参考一下关于java异常处理方面的知识 查看博客http://lavasoft.blog.51cto.com/62575/18920/ 这里介绍的很好,下面从中学习到一些东西,摘抄如下: 1. ...

  5. Java中的异常-Throwable-Error-Exception-RuntimeExcetpion-throw-throws-try catch

    今天在做一个将String转换为Integer的功能时,发现Integer.parseInte()会抛出异常NumberFormatException. 函数Integer.parseInt(Stri ...

  6. Java throw:异常的抛出怎么回事

    到目前为止,你只是获取了被Java运行时系统抛出的异常.然而,程序可以用throw语句抛出明确的异常.Throw语句的通常形式如下:    throw ThrowableInstance;这里,Thr ...

  7. [改善Java代码] 提倡异常的封装

    JavaAPI提供的异常都是比较低级别的,低级别是指只有开发人员才能看懂的异常.而对于终端用户来说基本上就是天书,与业务无关,是纯计算机语言的描述. 异常封装的三方面的好处: 1)提高系统的友好性   ...

  8. java学习一目了然——异常必知

    java学习一目了然--异常必知 我们只要学java,异常肯定非常熟悉,该抛的时候抛一下就行.但是这其中还有点小细节需要注意.就用这个小短篇来说一下异常处理中的小细节吧. 异常处理 RuntimeEx ...

  9. Java基础笔记-异常

    Java中的异常机制: Throwable类是 Java 语言中所有错误或异常的超类.主要包括两个子类: Error和Exception. 一般中要处理的异常是Exception. Java中最常见的 ...

  10. getActionBar().setTitle(); Java.lang.NullPoint异常解决方案

    getActionBar().setTitle(); Java.lang.NullPoint异常解决方案,是由于低版本不支持直接获取的缘故,修改方案: try changing your theme ...

随机推荐

  1. 使用多层RNN-LSTM网络实现MNIST数据集分类及常见坑汇总

    1 前言 循环神经网络(Recurrent Neural Network, RNN)又称递归神经网络,出现于20世纪80年代,其雏形见于美国物理学家J.J.Hopfield于1982年提出的可作联想存 ...

  2. Laravel入坑指南(10)——事件Event

    不知不觉,我们已经来到了第10小节.这一小节,我们一起讨论关于"事件"这个话题.众所周知,从二进制到汇编,再到高等级语言,这一路发展下来,代码都是顺序执行的,那么事件是什么?这个事 ...

  3. ffmpeg之avformat_alloc_output_context2

    函数原型: int avformat_alloc_output_context2(AVFormatContext **ctx, const AVOutputFormat *oformat, const ...

  4. 我的小程序之旅二:如何创建一个微信小程序

    第一步.准备邮箱 如果只是个人想体验一下小程序,直接用自己的QQ邮箱就行,但是这样申请的小程序很多权限都是没有的,比如获取用户手机号授权. 如果是企业或服务商要进行开发小程序,那么至少准备三个邮箱,同 ...

  5. 封装一些常用的 qt 控件

    在 qt 中需要做 toast 效果和图片 tip 效果,故开发了下面一个类 后续会继续添加一些常用的控件 tool_tip.h #include <qlabel.h> #include ...

  6. locals和globals,函数的嵌套,nonlocal,闭包函数及特点以及匿名函数---day11

    1.locals和globals 1.1locals  获取当前作用域中的所有内容 locals 如果在函数外,调用locals(),获取打印的是打印之前的所有变量,返回字典,全局空间作用域 loca ...

  7. 基于javaweb的个人音乐网站

    一 .需求 ① 前台用户: 用户注册和登录以及完善个人资料: 添加好友功能(用户之间可通过发送好友申请添加好友,被添加人可以同意或拒绝好友申请): 下载歌曲功能(当用户点击下载按钮时,就能下载相对应的 ...

  8. 【Azure App Service】App Service设置访问限制后,使用git clone代码库出现403报错

    问题描述 在App Service中,为App Service配置了访问限制,结果导致在克隆App Service的代码时候,遇见403错误. 问题解答 因为在使用 git clone App Ser ...

  9. 【Azure Cloud Service】Cloud Service(Classic) 迁移失败,找不到解决方案怎么办?

    问题描述 很老很老的云服务,在迁移到 Cloud Service(Extended Support)[云服务外延支持] 时,迁移的验证步骤不通过,因为资源中没有包含虚拟网络(Virtual Netwo ...

  10. 【Azure 应用服务】App Service的运行状况检查功能失效,一直提示"实例运行不正常"

    问题描述 为App Service配置了健康检查,单独访问Health Check Path的路径,返回代码为200.但为什么在App Service的页面上,一直提示"实例运行不正常&qu ...