有没有办法获得连接到 Oracle DB 服务器的 JDBC 连接的主机和端口?
我知道,我可以解析 URL。但是我们使用故障转移,我想知道我实际连接的是哪台服务器。由于我们使用不同的格式,URL 的解析是静态的并且容易出错。
在连接元数据中找不到它。
使用 'select * from global_name' 我可以获得服务名称。但是我还没有找到一种方法来获取我们连接的主机和端口。
任何的想法?
以下是您可以从连接中获得的一些信息:
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
不确定端口(实际上是侦听器上的端口),但对于主机,您可以尝试:
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 应用程序控制连接,因此不必担心,但如果您关心,请参阅此处了解更多信息。
这应该为您提供正在运行的实例的主机名:
select host_name from v$instance
尝试以下之一:
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