基于openjdk的jdbc连不上mysql?

熟悉ranger的应该知道,ranger服务端将服务鉴权的策略信息存储在mysql中。

在使用oracle jdk的过程中,一直都没有出现问题,ranger能正确从mysql读取和存放数据。然而在切换到openjdk后,出现了ranger启动无法连接到mysql的现象,并且从日志中看到有如下的报错信息:

SQLException: SQL state: 08S01 com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

通过一番源码分析与网上类似错误信息的搜索,最终定位为:openjdk 1.8.0_291开始,默认禁用了tls1.0和1.1版本,导致jdbc与mysql的连接无法正确建立,从而报错:

dfa81a5c51cb8df12cfc55ee9b64dc46.png

详细release戳这里:https://www.java.com/en/download/helprelease_changes.html

对比oracle jdk的版本,jdbc连接中没有手动指定 useSSL=false 的时候,其连接的建立仍旧还是使用了tls的方式,并且默认使用1.1版本进行交互。

ecee07389e1fd94993f5adec947278bf.png

使用openjdk后,因禁用tls1.1,无法正确发送client hello,因而无法建立连接。

7884765a5da9e7f91f12bc30d643df52.png

解决的办法其实很简单:

一种方法是在jdbc中指定不使用ssl,即增加参数useSSL=false,这种是比较常见的解决办法。

但有一点,因为其连接交互过程没有进行加密,安全无法得到保证(通常mysql都在内网,与平台服务交互,其网络环境本身相对比较安全,因此不进行加密也没有太大风险)

另一种方法就是在jdbc中指定使用tls1.2版本建立连接并与mysql进行交互。即增加参数enabledTLSProtocols=TLSV1.2。

而mysql默认同时支持tls1.0/1.1/1.2,因此不会出现问题。

指定tls1.2后,建立连接交互的抓包如下图所示:

1156576cf1bba74c8af02cb5de05e357.png

小结一下,针对连接异常的报错日志,网上能搜到的解决办法大多数是第一种,实际上手动指定使用tls1.2也是可以的,本文的总结算是查漏补缺。

好了,本文就介绍到这里,原创不易,点赞,在看,分享是最好的支持, 谢谢~

另外,公众号下方整理了两个菜单

94fbffa5d8a3d8406eac497df8f12dd7.png

一个是增加了归类后的历史文章,当前有hdfs、yarn、ranger、rabbitmq系列,后续会有更多系列文章;另一个是增加了个人微信,对文章中有不正确的地方,有所欠缺的地方,可以加我微信交流,当然不仅限于文章的问题,其他技术问题也都可以交流。

587b72431038aa479f103ddf1fe7a1d5.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值