有沒有辦法將JDBC連接的主機和端口連接到Oracle數據庫服務器?獲取從jdbc連接到oracle服務器的活動主機和端口(不解析url)
我知道,我可以解析URL。但是我們使用故障轉移,並且我想知道,我實際上連接了哪臺服務器。由於我們使用的格式不同,所以解析URL是靜態的並且容易出錯。
在連接元數據中找不到它。
使用'select * from global_name'我可以得到servicename。但我還沒有找到一種方法來獲得主機和端口,我們連接到。
有什麼想法?
有沒有辦法將JDBC連接的主機和端口連接到Oracle數據庫服務器?獲取從jdbc連接到oracle服務器的活動主機和端口(不解析url)
我知道,我可以解析URL。但是我們使用故障轉移,並且我想知道,我實際上連接了哪臺服務器。由於我們使用的格式不同,所以解析URL是靜態的並且容易出錯。
在連接元數據中找不到它。
使用'select * from global_name'我可以得到servicename。但我還沒有找到一種方法來獲得主機和端口,我們連接到。
有什麼想法?
不知道的端口(這是真正的監聽端口),但對於主機,你可以嘗試:
select utl_inaddr.get_host_name, utl_inaddr.get_host_address from dual;
上有DB側其他選項(如查詢v $實例),請參閱here。例如,您可能使用的SID:
select sys_context('userenv','instance_name') from dual;
希望有所幫助。另請注意,我使用utl_inaddr,但僅用於記錄和電子郵件/警報目的。
編輯:
此外,要知道,有與欺騙Oracle會話信息有些顧慮,部分原因我注意到,我只能用這個上下文添加到警報和日誌。我不會假裝知道所有的輸入/輸出,但基本上這個問題涉及假裝成某個人(或某個地方)的客戶。由於您通過Java應用程序控制連接,因此不應該擔心,但如果您在意,請參閱here。
Thx爲安全提示!我們正在考慮密碼保護這些信息。只有具有適當權限的登錄用戶才能看到此信息。 – Andreas
您需要讓您的DBA設置ACL以在Oracle 11g中運行上述查詢,以避免以下ORA-24247:網絡訪問被訪問控制列表(ACL) 拒絕:ORA-06512:位於「SYS.UTL_INADDR」 ,第4行 ORA-06512:在「SYS.UTL_INADDR」,第35行見http://www.smartmarmot.com/2011/10/error-ora-24247-network-access-denied-by-access-control- list-acl-and-ora-06512-on-orabbix/ –
這裏有一些信息,你可以從一個連接獲得:
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
thx爲答案。但這不是我需要的信息。我需要我們實際連接的主機,端口和sid。 – Andreas
我已經編輯我的帖子與輸出的例子。如果你想獲得URL的單個組件,你可能需要解析它,因爲我不認爲這些元素可以單獨使用,但是無論如何,這很容易:搜索字符「@」,然後分割字符「:」格式是... @ HOSTNAME:PORT:SID – Farid
我已經完成了它(查看元數據和解析url)。但是在我們的例子中,URL經常更復雜一些。例如jdbc:oracle:thin:@(DESCRIPTION_LIST =(DESCRIPTION =(CONNECT_TIMEOUT = 10)(RETRY_COUNT = 3)(ADDRESS_LIST =(ADDRESS =(PROTOCOL = tcp)(HOST = xyz1.abc.de)(PORT = 6778))) (CONNECT_DATA =(SERVICE_NAME = Service2.oracle.db.de)))(DESCRIPTION =(CONNECT_TIMEOUT = 60)(RETRY_COUNT = 1)(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = xyz2.abc.de)( PORT = 6777)))(CONNECT_DATA =(SERVICE_NAME = Service2.oracle.db.de))))我解析了這種URL和你提到的類型。 – Andreas
這應該給你,你從運行實例的主機名:
select host_name from v$instance
爲什麼你需要知道哪些主機的應用程序連接到?你想要滿足什麼用例? –
我們有幾個應用程序服務器可以連接到多個數據庫服務器。應用程序服務器可通過不同的URL訪問。如果我們發現一個錯誤,我們需要一個簡單的方法來了解我們正在關注的組合(應用服務器和數據庫服務器的組合)。爲了實現這一點,我們希望在我們的web gui上顯示應用程序服務器和數據庫服務器。對於故障轉移測試,很高興知道我們實際連接到哪個數據庫服務器。 – Andreas
這是完全意義上的。 –