DBeaver中Oracle连接使用socks代理

背景

由于安全原因,公司网络做了限制,必须通过代理才能连接数据库。
代理有两种方式,一种是动态代理,一种是端口转发,本文描述在基于socks动态代理下,DBeaver无法访问数据库的问题现象以及分析、解决。
在Dbeaver中创建Oracle连接时,设置了代理,如下:
在这里插入图片描述
其中的proxy.com是基于hosts文件配置的解析。
在DBeaver中通过socks代理访问Oracle数据库失败,报错信息如下:
在这里插入图片描述
由于通过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
在这里插入图片描述
意思是jdbc驱动从12.2版本开始,不支持socks代理,即使设置了socks代理最终也没有效果。
Dbeaver是通过Java语言开发的程序,其连接数据库也是通过jdbc去连接,如果jdbc本身不支持代理,那么即使设置了代理也没有意义。

解决方案

定位到问题后开始尝试解决,第一次使用DBeaver连接Oracle时会自动下载驱动,通过DBeaver中的驱动管理可以看到,下载的驱动版本是12.2.0.1,正好在受影响的版本范围内。
在这里插入图片描述
知道原因,解决起来就方便多了,继续搜索,在stackoverflow中找到如下参数:oracle.jdbc.javaNetNio=false
地址如下:https://stackoverflow.com/questions/49357985/does-oracle-jdbc-driver-support-socks5-proxy
从字面意思看,通过该参数,可以限制oracle驱动使用Nio。
于是在DBeaver中设置自定义驱动属性,完成后问题解决。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
需要.net4平台,引用之后,访问工具类示例: using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Data.SqlClient; using System.Security.Cryptography; using System.IO; using Oracle.ManagedDataAccess.Client; namespace DBconnection { public class DBHelper { /// <summary> /// 读取数据库连接 /// </summary> public static readonly string OracleConnectionStr = @"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.9.211)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=HIS)));Persist Security Info=True;User ID=ZLHIS;Password=o15ntu;"; /// <summary> /// 集合查询:在此完成所有的集合类型查询 /// </summary> /// <param name="sqlQuery">查询语句</param> /// <returns>结果集合</returns> public static DataSet OracleFillTable(string sqlQuery) { using (OracleConnection con = new OracleConnection(OracleConnectionStr)) { //创建数据适配器,将查询语句及连接字符串两个参数传进数据适配器 con.Open(); OracleCommand cmd = con.CreateCommand(); cmd.CommandText = sqlQuery; //新建一个表格对象dt,用来获取查询的数据 DataSet ds = new DataSet(); try { //填充表格 OracleDataAdapter oda = new OracleDataAdapter(cmd); oda.Fill(ds); //如果查询无误,则返回查询出的数据 return ds; } catch { //执行查询出现错误,返回null值 return null; } finally { //主动销毁所用的资源 ds.Dispose(); cmd.Dispose(); // 关闭连接 con.Close(); } } } /// <summary> /// 集合查询:在此完成所有的集合类型查询 /// </summary> /// <param name="sqlQuery">查询语句</param> /// <returns>结果集合</returns> public static string OracleGetTable(string sqlQuery) { string result = null; try { using (OracleConnection con = new OracleConnection(OracleConnectionStr)) { OracleCommand cmd = con.CreateCommand(); try { con.Open(); cmd.CommandText = sqlQuery; try { //执行sql语句 result = cmd.ExecuteScalar().ToString(); } catch { result = "-1"; } } catch (Exception e) { throw new Exception("数据库连接出现错误!"); } finally { //主动销毁资源 cmd.Dispose(); // 关闭连接 con.Close(); } } } catch (Exception e) { // MessageBox.Show(e.ToString()); } return result; } } }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值