背景

由于安全原因,公司网络做了限制,必须通过代理才能连接数据库。

代理有两种方式,一种是动态代理,一种是端口转发,本文描述在基于socks动态代理下,DBeaver无法访问数据库的问题现象以及分析、解决。

在Dbeaver中创建Oracle连接时,设置了代理,如下:

DBever连接SQL Server dbever连接oracle 驱动_oracle


其中的proxy.com是基于hosts文件配置的解析。

在DBeaver中通过socks代理访问Oracle数据库失败,报错信息如下:

DBever连接SQL Server dbever连接oracle 驱动_连接数据库_02


由于通过socks连接数据库对我来说是刚需,所以这个问题需要快速解决。

问题分析

首先检查socks端口是否通畅,通过telnet proxy.com 1080发现没有问题。

于是打开wireshark,通过tcp.port == 1080监听1080端口,然后再通过DBeaver连接数据库,发现没有数据包,到此得出初步结论:

通过DBeaver连接Oracle数据库,即使设置有socks连接配置,但是在实际连接时也不会走代理服务器。

通过Google搜索,找到了原因:https://support.oracle.com/knowledge/Middleware/2589708_1.html

DBever连接SQL Server dbever连接oracle 驱动_连接数据库_03


意思是jdbc驱动从12.2版本开始,不支持socks代理,即使设置了socks代理最终也没有效果。

Dbeaver是通过Java语言开发的程序,其连接数据库也是通过jdbc去连接,如果jdbc本身不支持代理,那么即使设置了代理也没有意义。

解决方案

定位到问题后开始尝试解决,第一次使用DBeaver连接Oracle时会自动下载驱动,通过DBeaver中的驱动管理可以看到,下载的驱动版本是12.2.0.1,正好在受影响的版本范围内。

DBever连接SQL Server dbever连接oracle 驱动_DBever连接SQL Server_04


知道原因,解决起来就方便多了,继续搜索,在stackoverflow中找到如下参数:oracle.jdbc.javaNetNio=false

地址如下:https://stackoverflow.com/questions/49357985/does-oracle-jdbc-driver-support-socks5-proxy

从字面意思看,通过该参数,可以限制oracle驱动使用Nio。

于是在DBeaver中设置自定义驱动属性,完成后问题解决。

DBever连接SQL Server dbever连接oracle 驱动_oracle_05