2

有没有办法获得连接到 Oracle DB 服务器的 JDBC 连接的主机和端口?

我知道,我可以解析 URL。但是我们使用故障转移,我想知道我实际连接的是哪台服务器。由于我们使用不同的格式,URL 的解析是静态的并且容易出错。

在连接元数据中找不到它。

使用 'select * from global_name' 我可以获得服务名称。但是我还没有找到一种方法来获取我们连接的主机和端口。

任何的想法?

4

4 回答 4

3

以下是您可以从连接中获得的一些信息:

            Connection dbConnection = null;
        try {
            dbConnection = dataSource.getConnection();
            DatabaseMetaData dbMetaData = dbConnection.getMetaData();
            getLogger().debug("DB Product Name   = " + dbMetaData.getDatabaseProductName());
            getLogger().debug("DB Product Version= " + dbMetaData.getDatabaseProductVersion());
            getLogger().debug("DB Driver Name    = " + dbMetaData.getDriverName());
            getLogger().debug("DB Driver Version = " + dbMetaData.getDriverVersion());
            getLogger().debug("DB Username         = " + dbMetaData.getUserName());
            getLogger().debug("DB URL            = " + dbMetaData.getURL());
        } catch (Exception e) {
            getLogger().debug("Failed to recover DatabaseMetaData: "+e.getMessage(), e);
        } finally {
            if (dbConnection != null) {
                try {
                    dbConnection.close();
                } catch (Exception ex) {
                    getLogger().error("Failed to close the DB connection: "+ex.getMessage(), ex);
                }
            }
        }

如果您需要更多/不同的信息,请检查 DatabaseMetaData。输出示例:

DB Product Name   = Oracle
DB Product Version= Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options
DB Driver Name    = Oracle JDBC driver
DB Driver Version = 11.2.0.2.0
DB Schema         = XXXXX
DB URL            = jdbc:oracle:thin:@XXX.XXX.XXX.XXX:11010:MYSID
于 2012-06-01T12:21:25.333 回答
2

不确定端口(实际上是侦听器上的端口),但对于主机,您可以尝试:

select utl_inaddr.get_host_name, utl_inaddr.get_host_address from dual;

db 端还有其他选项(例如查询 v$instance),请参见此处。例如,您可能使用的 SID:

select sys_context('userenv','instance_name') from dual;

希望有帮助。另请注意,我使用 utl_inaddr,但仅用于日志记录和电子邮件/警报目的。

编辑:

另外,请注意,欺骗 Oracle 会话信息存在一些问题,部分原因是我注意到我只使用它来向警报和日志添加上下文。我不假装知道所有的来龙去脉,但基本上这个问题涉及假装是其他人(或来自其他地方)的客户。由于您是通过 java 应用程序控制连接,因此不必担心,但如果您关心,请参阅此处了解更多信息。

于 2012-06-01T12:51:53.133 回答
1

这应该为您提供正在运行的实例的主机名:

select host_name from v$instance

于 2012-06-04T17:17:50.973 回答
0

尝试以下之一:

select sys_context('userenv','instance_name') from dual;
select sys_context('userenv','instance') from dual;
select sys_context('userenv','server_host') from dual;

文档:https ://docs.oracle.com/cd/B19306_01/server.102/b14200/functions165.htm

于 2020-04-01T12:53:08.540 回答