2012-06-01 17 views
2

有沒有辦法將JDBC連接的主機和端口連接到Oracle數據庫服務器?獲取從jdbc連接到oracle服務器的活動主機和端口(不解析url)

我知道,我可以解析URL。但是我們使用故障轉移,並且我想知道,我實際上連接了哪臺服務器。由於我們使用的格式不同,所以解析URL是靜態的並且容易出錯。

在連接元數據中找不到它。

使用'select * from global_name'我可以得到servicename。但我還沒有找到一種方法來獲得主機和端口,我們連接到。

有什麼想法?

+1

爲什麼你需要知道哪些主機的應用程序連接到?你想要滿足什麼用例? –

+1

我們有幾個應用程序服務器可以連接到多個數據庫服務器。應用程序服務器可通過不同的URL訪問。如果我們發現一個錯誤,我們需要一個簡單的方法來了解我們正在關注的組合(應用服務器和數據庫服務器的組合)。爲了實現這一點,我們希望在我們的web gui上顯示應用程序服務器和數據庫服務器。對於故障轉移測試,很高興知道我們實際連接到哪個數據庫服務器。 – Andreas

+0

這是完全意義上的。 –

回答

2

不知道的端口(這是真正的監聽端口),但對於主機,你可以嘗試:

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

+0

Thx爲安全提示!我們正在考慮密碼保護這些信息。只有具有適當權限的登錄用戶才能看到此信息。 – Andreas

+0

您需要讓您的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/ –

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 
+0

thx爲答案。但這不是我需要的信息。我需要我們實際連接的主機,端口和sid。 – Andreas

+0

我已經編輯我的帖子與輸出的例子。如果你想獲得URL的單個組件,你可能需要解析它,因爲我不認爲這些元素可以單獨使用,但是無論如何,這很容易:搜索字符「@」,然後分割字符「:」格式是... @ HOSTNAME:PORT:SID – Farid

+0

我已經完成了它(查看元數據和解析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

1

這應該給你,你從運行實例的主機名:

select host_name from v$instance

+0

不適用於我:執行SQL命令時發生錯誤: 從v $ instance中選擇host_name ORA-00942:表或視圖不存在[ SQL State = 42000,DB Errorcode = 942] – Andreas

+0

如果你在sqlplus中運行這個查詢,你會得到這個錯誤嗎? –

+1

要運行此查詢,您需要dba權限。然後,它也應該在我的JDBC工具中工作。但我們決定從'select * from global_name'顯示服務名稱,該名稱在我們的網絡中應該是唯一的。爲你的努力+1。 – Andreas

相關問題