JDBC 的應用鏈接Oracle 遇到問題,錯誤以下:java
ORA-12505,TNS:listener does not currently know of SID given in connect descriptor TheConnection descriptor used by the client was。sql
我在DB 層面配置了靜態註冊,而且GLOBAL_DBNAME和SID_NAME 不同,以往的配置都是同樣的,因此沒有發現這個問題。oracle
(SID_DESC =app
(GLOBAL_DBNAME = dave)測試
(ORACLE_HOME =D:\app\Administrator\product\11.2.0\dbhome_1)google
(SID_NAME = NEWCCS)spa
).net
Oracle Listener 動態註冊 與 靜態註冊orm
http://blog.csdn.net/tianlesoftware/article/details/5543166server
在網上google 了一下,發現JDBC Thin Driver 的formats 有三種格式:
jdbc:oracle:thin:@//<host>:<port>/<service_name>
Example: jdbc:oracle:thin:@//192.168.2.1:1521/XE
注意這裏的格式,@後面有//, 這是與使用SID的主要區別。
這種格式是Oracle 推薦的格式,由於對於集羣來講,每一個節點的SID 是不同的,可是SERVICE_NAME 確能夠包含全部節點。
jdbc:oracle:thin:@<host>:<port>:<SID>
Example: jdbc:oracle:thin:192.168.2.1:1521:X01A
Note: Support for SID is being phased out. Oracle recommends that users switch over to usingservice names.
jdbc:oracle:thin:@<TNSName>
Example: jdbc:oracle:thin:@GL
Note:
Support for TNSNames was added in the driver release 10.2.0.1
Oracle 是11gR2
Listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = dave)
(ORACLE_HOME =D:\app\Administrator\product\11.2.0\dbhome_1)
(SID_NAME = NEWCCS)
)
)
Tnsnames.ora
DVD =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = dave)
)
)
將2.2 節的dbUrl 改爲以下:
String dbUrl = "jdbc:oracle:thin:@//127.0.0.1:1521/dave";
輸出結果:
MGMT_VIEW--97
ANQING--94
DVD--93
SYSMAN--95
若是在11g裏遇到以下錯誤:
測試運行Java 類,報錯:
java.sql.SQLException: The Network Adapter could not establish the connection
能夠嘗試更換對應的 jdbc connection driver,官網的說明以下:
JDBC Thin Driver 11g Causes"Java.Sql.Sqlexception: Io Exception: The Network Adapter Could NotEstablish The Connection" While Connecting to Oracle Database 11g [ID947653.1]
Change the JDBC connection driver class inyour application server from:
oracle.jdbc.driver.OracleDriver
to
oracle.jdbc.OracleDriver
String dbUrl = "jdbc:oracle:thin:@dvd";
報錯以下:
java.sql.SQLException: Unknown host specified
該問題是由於JVM 沒有oracle.net.tns_admin的system property。 解決方法有2種:
方法一:在啓動VM 時添加以下參數:
-Doracle.net.tns_admin=D:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN
方法二:在java 代碼裏添加:
System.setProperty("oracle.net.tns_admin","D:\\app\\Administrator\\product\\11.2.0\\dbhome_1\\NETWORK\\ADMIN");
添加以後,就能夠正常在JDBC中使用tnsnama了。
-------------------------------------------------------------------------------------------------------
版權全部,文章容許轉載,但必須以連接方式註明源地址,不然追究法律責任!
Blog: http://blog.csdn.net/tianlesoftware
Weibo: http://weibo.com/tianlesoftware
-------------------------------------------------------------------------------------------------------