Oracle的jdbc驅動三種主要分類:
1、JDBC OCI: oci是oracle call interface的縮寫,此驅動類似于傳統的ODBC 驅動。因為它需要Oracle Call Interface and Net8,所以它需要在運行使用此驅動的JAVA程序的機器上安裝客戶端軟件,其實主要是用到orcale客戶端里以dll方式提供的oci和服務器配置。
2、JDBC Thin: thin是for thin client的意思,這種驅動一般用在運行在WEB瀏覽器中的JAVA程序。它不是通過OCI or Net8,而是通過Java sockets進行通信,是純java實現的驅動,因此不需要在使用JDBC Thin的客戶端機器上安裝orcale客戶端軟件,所以有很好的移植性,通常用在web開發中。
3、JDBC KPRB: 這種驅動由直接存儲在數據庫中的JAVA程序使用,如Java Stored Procedures 、triggers、Database JSP's。因為是在服務器內部使用,他使用默認或當前的會話連接來訪數據庫,不需要用戶名密碼等,也不需要數據庫url。
一.JDBC 連接Oracle 說明
JDBC 的應用連接Oracle 遇到問題,錯誤如下:
ORA-12505,TNS:listener does not currently know of SID given in connect descriptor TheConnection descriptor used by the client was。
我在DB 層面配置了靜態注冊,并且GLOBAL_DBNAME和SID_NAME 不一樣,以往的配置都是一樣的,所以沒有發現這個問題。
1
2
3
4
5
|
(SID_DESC = (GLOBAL_DBNAME = dave) (ORACLE_HOME =D:\app\Administrator\product\11.2.0\dbhome_1) (SID_NAME = NEWCCS) ) |
Oracle Listener 動態注冊 與 靜態注冊
//www.jfrwli.cn/article/75885.htm
在網上google 了一下,發現JDBC Thin Driver 的formats 有三種格式:
格式一: Oracle JDBC Thin using a ServiceName:
jdbc:oracle:thin:@//<host>:<port>/<service_name>
Example: jdbc:oracle:thin:@//192.168.2.1:1521/XE
注意這里的格式,@后面有//, 這是與使用SID的主要區別。
這種格式是Oracle 推薦的格式,因為對于集群來說,每個節點的SID 是不一樣的,但是SERVICE_NAME 確可以包含所有節點。
格式二: Oracle JDBC Thin using an SID:
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.
格式三:Oracle JDBC Thin using a TNSName:
jdbc:oracle:thin:@<TNSName>
Example: jdbc:oracle:thin:@GL
Note:
Support for TNSNames was added in the driver release 10.2.0.1
二.測試
2.1 準備工作:
Oracle 是11gR2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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 測試1,使用SID:newccs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
.imporjava.sql.* .publiclasjdb StrindbUr "jdbc:oracle:thin:@...::newccs" StrintheUse "dave" StrintheP "dave" Connectionull Statemenconn ResultSernull publijdbc( tr Class.forName( "oracle.jdbc.driver.OracleDriver" ).newInstance() DriverManager.getConnection(dbUrltheUserthePw) conc.createStatement() catc(Exceptioe e.printStackTrace() publibooleaexecuteUpdate(Strinsql tr conn.executeUpdate(sql) returtrue catc(SQLExceptioe e.printStackTrace() returfalse publiResultSeexecuteQuery(Strinsql rnull tr rconn.executeQuery(sql) catc(SQLExceptioe e.printStackTrace() returrs publivoiclose( tr conn. close () c. close () catc(Exceptioe e.printStackTrace() publistativoimain(String[args ResultSers jdbconnejdbc() rconn.executeQuery( "selecfrodavwherrownum<" ) tr whil(rs. next () System. out .println(rs.getString( "username" )+ "--" +rs.getString( "user_id" )) catc(Exceptioe e.printStackTrace() . . ---輸出正常 .MGMT_VIEW -- .ANQING -- .DVD -- .SYSMAN -- |
2.3 使用 service_name:dave
將2.2 節的dbUrl 改成如下:
1
|
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
2.4 使用TNS name: dvd
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 代碼里添加:
1
|
System.setProperty( "oracle.net.tns_admin" , "D:\\app\\Administrator\\product\\11.2.0\\dbhome_1\\NETWORK\\ADMIN" ); |
添加之后,就可以正常在JDBC中使用tnsnama了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
.imporjava.sql. .publiclasjd StrindbUr"jdbc:oracle:thin: @dvd .StrindbUr"jdbc:oracle:thin:@ //...:/dave .StrindbUr"jdbc:oracle:thin:@...::newccs StrintheUse"dave StrintheP"dave Connectionul Statemencon ResultSernul publijdbc t System.setProperty( "oracle.net.tns_admin" , "D:\\app\\Administrator\\product\\..\\dbhome_\\NETWORK\\ADMIN" Class.forName( "oracle.jdbc.driver.OracleDriver" ).newInstance( ./Class.forName( "oracle.jdbc.OracleDriver" ).newInstance( DriverManager.getConnection(dbUrltheUserthePw conc.createStatement( catc(Exceptio e.printStackTrace( publibooleaexecuteUpdate(Strinsq t conn.executeUpdate(sql returtru catc(SQLExceptio e.printStackTrace( returfals publiResultSeexecuteQuery(Strinsq rnul t rconn.executeQuery(sql catc(SQLExceptio e.printStackTrace( returr publivoiclose t conn.close( c.close( catc(Exceptio e.printStackTrace( publistativoimain(String[arg ResultSer jdbconnejdbc( rconn.executeQuery( "selecfrodavwherrownum<" t whil(rs.next( System.out.println(rs.getString( "username" )+ "--" +rs.getString( "user_id" ) catc(Exceptio e.printStackTrace( |
下面給大家分享一段代碼關于Java中通過jdbc(thin方式)連接Oracle數據庫
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
package com.jdbc.OracleTest; import java.sql.DriverManager; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class OracleJdbcConnectionTest { /** * by jarin 年月日 * @param args */ public static void main(String[] args) { try { //第一步要Jar包:在oracle安裝的目錄下,盤符:\oracle\ora\jdbc\lib\ojdbc.jar //加載驅動 Class.forName( "oracle.jdbc.driver.OracleDriver" ); //連接字符串(協議名:jdbc,子協議名: oracle:thin 子名稱:@localhost::oracleDB) String url = "jdbc:oracle:thin:@localhost::ora" ; try { //建立連接 Connection conn = DriverManager.getConnection(url, "scott" , "" ); //創建Statement或者是PreparedStatement語句 Statement st = conn.createStatement(); String sqlStr= "select ename from emp" ; //執行查詢 ResultSet rs = st.executeQuery(sqlStr); //遍歷結果 while (rs.next()) { System.out.println(rs.getString()); } } catch (SQLException e) { e.printStackTrace(); } } catch (ClassNotFoundException e) { e.printStackTrace(); } } } |