Java開發Oracle資料庫連接JDBC Thin Driver 的三種方法_java

來源:互聯網
上載者:User

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 不一樣,以往的配置都是一樣的,所以沒有發現這個問題。

 (SID_DESC =  (GLOBAL_DBNAME = dave)   (ORACLE_HOME =D:\app\Administrator\product\11.2.0\dbhome_1)  (SID_NAME = NEWCCS) )

Oracle Listener 動態註冊 與 靜態註冊

http://www.jb51.net/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

Listener.oraSID_LIST_LISTENER = (SID_LIST = (SID_DESC =  (GLOBAL_DBNAME = dave)   (ORACLE_HOME =D:\app\Administrator\product\11.2.0\dbhome_1)  (SID_NAME = NEWCCS) ) )Tnsnames.oraDVD = (DESCRIPTION = (ADDRESS_LIST =  (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) ) (CONNECT_DATA =  (SERVICE_NAME = dave) ) )

 2.2 測試1,使用SID:newccs

.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 改成如下:

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 代碼裡添加:

System.setProperty("oracle.net.tns_admin","D:\\app\\Administrator\\product\\11.2.0\\dbhome_1\\NETWORK\\ADMIN");

添加之後,就可以正常在JDBC中使用tnsnama了。

.imporjava.sql. .publiclasjdStrindbUr"jdbc:oracle:thin:@dvd .StrindbUr"jdbc:oracle:thin:@//...:/dave .StrindbUr"jdbc:oracle:thin:@...::newccsStrintheUse"daveStrintheP"daveConnectionulStatemenconResultSernulpublijdbc 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( returfalspubliResultSeexecuteQuery(Strinsq rnul t rconn.executeQuery(sql catc(SQLExceptio e.printStackTrace( returrpublivoiclose 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資料庫

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(); } } }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.