2012-05-25 91 views
1

我們正在使用的OID/LDAP查詢我們的連接配置LDAP/OID查找解決的Oracle SID。無論是TNS_ADMIN環境變量和oracle.net.tns_admin Java屬性都正確,點設置爲包含SQLNET.ORA和ldap.ora目錄。然而,JDBC連接URL:問題通過與瘦JDBC客戶

java.sql.SQLRecoverableException: IO Error: could not resolve the connect identifier "ourtnsalias" 
     at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:458) 
     at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:546) 
     at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:236) 
     at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) 
     at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521) 
     at java.sql.DriverManager.getConnection(DriverManager.java:582) 
     at java.sql.DriverManager.getConnection(DriverManager.java:185) 
     at TnsTest.main(TnsTest.java:29) 
Caused by: oracle.net.ns.NetException: could not resolve the connect identifier "tnsalias" 
     at oracle.net.resolver.NameResolver.resolveName(NameResolver.java:181) 
     at oracle.net.resolver.AddrResolution.resolveAndExecute(AddrResolution.java:416) 
     at oracle.net.ns.NSProtocol.establishConnection(NSProtocol.java:687) 
     at oracle.net.ns.NSProtocol.connect(NSProtocol.java:247) 
     at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1102) 
     at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:320) 
     ... 7 more 
Exception in thread "main" java.lang.NullPointerException 
     at TnsTest.main(TnsTest.java:46) 

連接字符串以下風格的成功連接:

  • 全部TNS字符串:
    jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host.company.com)(PORT=####))(CONNECT_DATA=(SERVICE_NAME=service_name)))
  • 全部LDAP嘗試連接時jdbc:oracle:thin:@ourtnsalias拋出異常url:
    jdbc:oracle:thin:@ldap://oid.company.net:####/ourtnsname,CN=OracleContext,dc=company,dc=net

這似乎暗示着問題在於LDAP/OID查找。但是,運行tnsping ourtnsname也連接成功。

做OID/LDAP查詢時,有沒有辦法在連接字符串中只使用一個TNS別名?

爲了完整起見,這裏是相關的Java:

String connectionURL = "jdbc:oracle:thin:@ourtnsalias"; 
System.setProperty("oracle.net.tns_admin", "c:/oracle/network/admin"); 
Class.forName("oracle.jdbc.OracleDriver"); 
Connection c = DriverManager.getConnection(connectionURL, userid, password); 
+0

我有完全一樣的問題 - 我們已經配置幾乎相同2臺服務器,一個正在與 - 和另外一個返回一個錯誤,甚至想過用tnsping等工作正常。 你有沒有找到解決方案? – Bittercoder

回答

0

我不是一個程序員,但一個DBA,並幫助我的同事一定的時間回來的同樣的問題。所以讓我知道如果這有助於

System.setProperty("oracle.net.tns_admin", "c:/oracle/network/admin"); 

應該

System.setProperty("oracle.net.tns_admin", "c://oracle//network//admin"); 

System.setProperty("oracle.net.tns_admin", "c:\\oracle\\network\\admin"); 
+0

經過兩種口味的測試,結果相同。 – jasonkarns

2

打我的頭靠在這個牆上後,原來我們是問題TNS名稱條目在多行中具有無效的製表符/間隔,導致它不能正確解析。

在ourt情況下,它來作爲一個驚喜,TNSPING能正確解析tnsnames.ora文件,但JDBC Oracle驅動程序沒有。

刪除在TNSNAMES條目中的所有空間,然後小心地將它放回,注意這裏描述的規則:

http://docs.oracle.com/cd/A57673_01/DOC/net/doc/NWUS233/apb.htm

幫助我們將解決這個問題。

什麼導致我們的答案是,改變了連接標識符,即從該切換時,我們會得到一個不同的錯誤:

jdbc:oracle:thin:@ourtnsalias 

要:

jdbc:oracle:thin:@unknown 

是給不同的錯誤(在Sysinternals的過程監控檢查,以確保tnsnames.ora文件實際上正在讀)沿着提出,它解析TNS文件,但有蹊蹺的是被絆倒事情的條目。

我不禁想,這一切可以很容易地解決,如果JDBC Oracle客戶端返回一個更有意義的錯誤,即「無法解析TNS入境連接標識符」!

希望這有助於其他人了:)

+0

謝謝......!解決了我的問題。在文件末尾有一個空格。 –

0

尋找在你的tnsnames.ora無效字符。

我在文件中有

test, test.WORLD=... 

。將其更改爲

test.WORLD= 

解決了該問題。