从jdbc连接到oracle服务器获取活动主机和端口(不解析url)

时间:2012-06-01 12:06:09

标签: java oracle jdbc

有没有办法将JDBC连接的主机和端口连接到Oracle数据库服务器?

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

无法在连接元数据中找到它。

使用'select * from global_name'我可以获得servicename。但我还没有找到一种获取主机和端口的方法,我们已连接到。

有什么想法吗?

4 个答案:

答案 0 :(得分:3)

以下是您可以从Connection获得的一些信息:

            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

答案 1 :(得分:2)

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

select utl_inaddr.get_host_name, utl_inaddr.get_host_address from dual;

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

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

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

编辑:

另外,请注意,欺骗Oracle会话信息存在一些问题,部分原因是我注意到我只使用它来为警报和日志添加上下文。我不假装知道所有的输入/输出,但基本上这个问题涉及假装成某人(或某处)的客户。由于您通过Java应用程序控制连接,因此不应该关注,但如果您愿意,请参阅here了解更多信息。

答案 2 :(得分:1)

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

select host_name from v$instance

答案 3 :(得分:0)

尝试以下一项:

<textarea [(ngModel)]="sometext"></textarea>

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