首页 > 解决方案 > DBeaver+Oracle:关闭IP到主机名解析

问题描述

出于某种奇怪的原因,带有 Oracle 驱动程序 12.2.0.1 的 DBeaver 21.0.2 似乎将配置的 IP 地址作为主机,将其转换为主机名,然后使用该主机名进一步用于连接到数据库。

这显然是不希望的,因为我从外部工作场所访问该数据库并且所有额外的网络都在 IP 地址上进行,这显然是我要走的路。

更奇怪的是,该决议似乎发生建立连接之后。我的意思是我有一次在服务名称中有错字,而我得到了 ORA-12514。一旦我修正了那个错字,我就回到了主机名解析问题,它没有 ORA 编号。所以这可能是 DBeaver 中的东西。

DBeaver 的错误协议:

java.net.UnknownHostException: myunknowndbhost.sjngm.com
    at java.base/java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
    at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(Unknown Source)
    at java.base/java.net.InetAddress.getAddressesFromNameService(Unknown Source)
    at java.base/java.net.InetAddress$NameServiceAddresses.get(Unknown Source)
    at java.base/java.net.InetAddress.getAllByName0(Unknown Source)
    at java.base/java.net.InetAddress.getAllByName(Unknown Source)
    at java.base/java.net.InetAddress.getAllByName(Unknown Source)
    at oracle.net.nt.TcpNTAdapter.connect(TcpNTAdapter.java:126)
    at oracle.net.nt.ConnOption.connect(ConnOption.java:161)
    at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:470)
    at oracle.net.resolver.AddrResolution.resolveAndExecute(AddrResolution.java:521)
    at oracle.net.ns.NSProtocol.establishConnection(NSProtocol.java:660)
    at oracle.net.ns.NSProtocol.establishConnection(NSProtocol.java:639)
    at oracle.net.ns.NSProtocolNIO.negotiateConnection(NSProtocolNIO.java:189)
    at oracle.net.ns.NSProtocol.connect(NSProtocol.java:317)
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1438)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:518)
    at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:688)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:39)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:691)
    at org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSource.lambda$0(JDBCDataSource.java:176)
    at org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSource.openConnection(JDBCDataSource.java:195)
    at org.jkiss.dbeaver.ext.oracle.model.OracleDataSource.openConnection(OracleDataSource.java:150)
    at org.jkiss.dbeaver.model.impl.jdbc.JDBCExecutionContext.connect(JDBCExecutionContext.java:101)
    at org.jkiss.dbeaver.model.impl.jdbc.JDBCRemoteInstance.initializeMainContext(JDBCRemoteInstance.java:100)
    at org.jkiss.dbeaver.model.impl.jdbc.JDBCRemoteInstance.<init>(JDBCRemoteInstance.java:59)
    at org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSource.initializeRemoteInstance(JDBCDataSource.java:109)
    at org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSource.<init>(JDBCDataSource.java:97)
    at org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSource.<init>(JDBCDataSource.java:89)
    at org.jkiss.dbeaver.ext.oracle.model.OracleDataSource.<init>(OracleDataSource.java:84)
    at org.jkiss.dbeaver.ext.oracle.OracleDataSourceProvider.openDataSource(OracleDataSourceProvider.java:147)
    at org.jkiss.dbeaver.registry.DataSourceDescriptor.connect(DataSourceDescriptor.java:896)
    at org.jkiss.dbeaver.runtime.jobs.ConnectJob.run(ConnectJob.java:70)
    at org.jkiss.dbeaver.runtime.jobs.ConnectionTestJob.run(ConnectionTestJob.java:103)
    at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:105)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)

所以问题是:我如何关闭这个主机名解析?

标签: oracledbeaver

解决方案


这可能是 Oracle 客户端行为...在用户身份验证期间,所有 Oracle 数据库客户端都需要向服务器报告“MACHINE”变量,描述客户端的主机名/IP - 这是数据库视图machine列中报告的内容。v$session而且我认为 JDBC 瘦客户端会在必要时进行反向 DNS 查找以尝试填充该变量。

您可以尝试在 DBeaver 中设置v$session.machine OracleConnection 属性...,编辑您的连接,单击“连接设置”页面上的“编辑驱动程序设置”,单击“驱动程序属性”选项卡,然后添加一个以v$session.machine您想要的任何名称命名的新属性作为值.

或者您可以尝试将ORACLE_HOSTNAME环境变量设置为您的主机名。我不清楚这是否会被 Oracle JDBC 驱动程序接收,但这个文档可能暗示它可以提供帮助?

您也可以尝试在 HOSTS 文件中为您的 IP 地址添加主机名。这似乎最有可能解决这个问题,但它是最烦人的实现选项。


推荐阅读