天天看點

Java連接配接oracle資料庫的OCI和THIN

使用jdbc連接配接上oracle有兩種方法:

1、 使用thin連接配接

由于thin驅動都是純Java代碼,并且使用TCP/IP技術通過java的Socket連接配接上Oracle資料庫,是以thin驅動是與平台無關的,你無需安裝Oracle用戶端,隻需要下載下傳一個thin驅動的jar包,并且将環境變量中的CLASS_PATH變量中加入thin驅動的路徑就可以了。Thin驅動雖然與平台無關,也無需安裝Oracle用戶端,但是有一個緻命的缺陷就是性能一般,達不到如OCI方式的企業級的要求。另外,如果一個oracle資料庫對應一台主機,可以使用thin連接配接;如果一個oracle資料庫對應四五台主機(叢集伺服器),使用thin時,需要把tnsnames.ora檔案中的相關資料庫的整個連接配接字元串都拷貝下來,如此才能連接配接上oracle叢集資料庫。而這種方法也是和數位同僚讨論并Google了大量資料後才發現的。之前我一直以為thin不支援叢集資料庫的方式。

然後就是設定連接配接字元串了。這個是固定的寫法,如下所示:

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection conn =DriverManager.getConnection ("jdbc:oracle:thin:@10.87.134.107:1521:ora9","sms" , "zzsms");

在上面的連接配接字元串中,如果不是叢集資料庫就在@後直接輸入資料庫IP位址即可;如果是叢集資料庫,則需要在@後輸入tnsnames.ora檔案中有關該資料庫的所有描述内容(通常是=後邊的所有的内容)。

2、 使用oci連接配接(Oracle Call Interface)

使用OCI連接配接資料庫是企業級的做法,适應于單個資料庫和叢集資料庫,性能優越,尤其是連接配接池功能大大提高了應用程式的性能和并發量。唯一的缺點是,若想使用OCI必須要安裝Oracle用戶端。

安裝完Oracle用戶端後,裡面有個jdbc的檔案夾,該檔案夾下就包含了OCI驅動和THIN驅動。是以是不需要去網上下載下傳的。這個驅動在jdbc/lib檔案夾下,主要有classes12.jar、nls_charset12.jar等等。其中以12結尾的驅動包适應于jdk1.1以上的版本。以11結尾的适應于jdk1.1以下的版本。檔案名中含有classes的jar包就是驅動程式,檔案名中含有nls的jar包是與國際化有關的類。

找到檔案後,就需要把class和nls的jar包的絕對路徑加入CLASS_PATH環境變量,否則會報ClassNotFound的異常。

設定環境變量後,就可以直接使用OCI驅動了,不要被“驅動”兩個字吓壞了,(驅動就是一個可執行檔案和一個連接配接字元串)。很簡單,無非是連接配接字元串的問題。标準的連接配接字元串如下所示:

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection con = DriverManager.getConnection("jdbc:oracle:oci:@xxzc","duansiyuan", "oracle_password");

隻要這兩行,就可以保證連接配接到資料庫,而這個資料庫不管是單個資料庫還是叢集資料庫。其中xxzc就是資料庫名,duansiyuan就是使用者名,oralce_password就是密碼。這種方式和C#中的方式比較類似。

需要注意的問題:

1、oracle_home/jdbc檔案夾下有大量的樣闆代碼和幫助文檔,裡面對如何安裝和使用jdbc都有詳細的說明,請引起高度重視并耐心閱讀。裡面有很多知識僅通過自己反複的實踐是無法擷取的。

2、如果想要高性能,請使用OCI連接配接,如果不想裝Oracle用戶端,請使用thin連接配接。

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。

  在應用開發的時候,通常是用前面兩種方式,下面是資料庫url的寫法:

  jdbc:oracle:thin:@server ip: service

  jdbc:oracle:oci:@service

  看來oci的還更加簡潔,ip可以省掉不寫了,這是因為oci驅動通過用戶端的native java methods來條用c library方式來通路資料庫伺服器,使用到了用戶端的net manager裡的資料庫服務配置。

  因為oci方式最終與資料庫伺服器通信互動是用的c library庫,理論上性能優于thin方式,據說主要是展現在blob字段的存取上。

  開發oracle經常用到的 pl sql dev使用的估計是oci方式,需要安裝用戶端,但也可以不安裝,但是要抽出其中的oci相關的dll即jar包、注冊環境變量、配置偵聽檔案等,無需安裝oracle用戶端,用plsql連接配接遠端oracle 詳細步見附注。

  oracle在10g之後提供了精簡用戶端,安裝的過程應該包括上面的那些工作。

    代碼示例:

    package src.test;

import java.sql.*;

public class dbOCI {

 public static void main1() throws SQLException {

  try {

   Class.forName("oracle.jdbc.driver.OracleDriver");

   Connection conn = DriverManager.getConnection(

     "jdbc:oracle:oci:@oracle92", "scott", "tiger");

   Statement stmt = conn.createStatement();

   ResultSet rset = stmt.executeQuery("select * from dept");

   while (rset.next())

    System.out.println(rset.getString(1));

   stmt.close();

   conn.close();

  } catch (ClassNotFoundException e) {

   e.printStackTrace();

  }

 }

}

package src.test;

import java.sql.*;

public class dbThin {

 public static void Main2() {

  try {

   Class.forName("oracle.jdbc.driver.OracleDriver");

   String url = "jdbc:oracle:thin:@192.168.0.100:1521:server9i";

   Connection c = DriverManager.getConnection(url, "scott", "tiger");

   Statement stmt = c.createStatement();

   String sql = "select * from dept";

   ResultSet rs = stmt.executeQuery(sql);

   while (rs.next()) {

    System.out.println("dname: " + rs.getString("dname"));

   }

   stmt.close();

   c.close();

  } catch (Exception e) {

   e.printStackTrace();

  }

 }

}

附注:

無需安裝oracle用戶端,用plsql連接配接遠端oracle 步驟

1、在安裝ORACLE伺服器的機器上搜尋下列檔案, 

oci.dll 

ocijdbc10.dll 

ociw32.dll 

orannzsbb10.dll 

oraocci10.dll 

oraociei10.dll 

sqlnet.ora 

tnsnames.ora 

classes12.jar 

ojdbc14.jar 

放到一個檔案夾,如 oraclient

  2、配置tnsnames.ora,如果本機上沒有安裝oracle, 

可以從安裝了oracle的機上拷貝一個(tnsnames.ora檔案在%ORACLE_HOME%/network/admin下)放在上面的目錄D:/oraclient下。 

oracledata = 

(DESCRIPTION = 

    (ADDRESS_LIST = 

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.58)(PORT = 1521)) 

    ) 

    (CONNECT_DATA = 

      (SERVICE_NAME = oracledata) 

    ) 

)

3、添加一個環境變量,名為TNS_ADMIN,值為tnsnames.ora檔案所在路徑(如:D:/oraclient,特别是重裝後或其它操作,忘了TNS_ADMIN變量,plsql登陸就會報無法解析指定的連接配接辨別符),這是為了能夠找到上面說的tnsnames.ora。如果本機上安裝了ORACLE,并且設定了ORACLE_HOME環境變量,那麼會自動在%ORACLE_HOME%/network/admin/位置查找tnsnames.ora檔案。

4、設定ORACLE的語言,添加環境變量: 

“NLS_LANG = SIMPLIFIEDCHINESE_CHINA.ZHS16GBK”,(AMERICAN_AMERICA.US7ASCII 是ASCII編碼類型,其它類型可自己到伺服器看一下或網上查找一下)