天天看點

Oracle JDBC Drivers (Thin & OCI Drivers)

Oracle8   JDBC   Drivers  

  Oracle8提供兩種JDBC  

Driver,JDBC   Thin和JDBC   OCI(Oracle   Call   Interface)。JDBC  

Thine是Type4   Driver,JDBC   OCI是Type2   Driver。JDBC   一共有4種類型的Driver:  

  Type1:JDBC-ODBC橋,将JDBC調用轉換到ODBC調用。  

  Type2:使用本地API,将JDBC調用轉換到特定的DBMS調用。  

 Type3:網絡JDBC,将JDBC調用轉換成與DBMS無關的網絡協定,然後再轉換成特定的DBMS協定。  

  Type4:本地JDBC,将JDBC調用直接轉換成特定DBMS協定。  

  Type1和Type2需要在客戶機安裝特定的二進制代碼,後兩種Driver則不需要。是以JDBC   OCI  

Driver不能用于Applet中,因為它調用C庫,是與平台相關的,無法下載下傳到客戶機的未知平台浏覽器中運作。對于Applet中通路資料庫,隻能用

JDBC   Thine   Driver。  

  關于JDBC   OCI   Driver  

  由于調用了本地C庫,據說(Oracle一向比較能吹,不知道是不是真的@_@)效率很高,建議在Application中使用此種Driver。若要使用OCI   Driver,必須在用戶端安裝Oracle   Net8才行。連接配接方法:  

  DriverManager.registerDriver(new   oracle.jdbc.driver.OracleDriver());  

DriverManager.getConnection("jdbc:oracle:oci8:@(description=(address=(host=localhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl)))",

  "bigmouse",   "mouse");  

  關于JDBC   Thin   Driver  

  由于JDBC   Thin   Driver使用TCP/IP   Sockets連接配接,是以必須先要啟動Oracle   TNS   Listener服務。連接配接方法:  

  DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl   ",   "bigmouse",   "mouse");  

  關于預取行(Prefetching   Rows)  

一般情況下,JDBC從結果集中一次隻讀取一行。可以使用OracleStatement.setRowPrefetch()指定特定Statement

一次取出的行數,這可以提高JDBC的性能。使用OracleConnection.setDefaultRowPrefetch()可以指定所有

Statement一次取出的行數,預設是10行。需要注意的是,Statement隻在建立的時候從Connection獲得預取行數,如果後來

Connection改變了此值,則先前建立的Statement并不會自動跟着改變預取行數值。另外,對于LONG和LONG  

ROW類型,設定預取行的值無效,JDBC每次隻會取一行。  

  一個例子:  

  <%@   page    

  import="java.sql.*,  

  oracle.jdbc.driver.*"  

  %>  

  <%  

  try  

  {  

  //注冊驅動  

  //使用Thin類型連接配接到資料庫,傳回Connnection對象,并轉換成OracleConnection對象。  

  OracleConnection   conn   =  

(OracleConnection)DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl

  ",   "bigmouse",   "mmouse");  

  //設定所有Statemnt預取5行  

  conn.setDefaultRowPrefetch(5);  

  //建立Statement對象,并從Connection獲得預設預取行值5。  

  OracleStatement   stmt   =   (OracleStatement)conn.createStatement();  

  //顯示預設預取行值和剛建立的Statement的預取值  

  //Default=5;Current=5  

  out.println("Default="   +   conn.getDefaultRowPrefetch()   +   ";Current="   +   stmt.getRowPrefetch());  

  out.println("<br><br>");  

  //獲得結果集  

  ResultSet   rs   =   stmt.executeQuery("SELECT   topic   FROM   my_article");  

  while   (rs.next())  

  out.println(rs.getString(1));  

  out.println("<br>");  

  }  

  //設定Statement的預取行,覆寫預設設定  

  stmt.setRowPrefetch(3);  

  //Default=5;Current=3  

  rs   =   stmt.executeQuery("SELECT   topic   FROM   my_article");  

  rs.close();  

  stmt.close();  

  conn.close();  

  catch   (Exception   e)  

  out.println(e.getMessage());  

  關于批量送出(Batching   Updates)  

預設情況下,當PreparedStatement執行executeUpdate()後,就會馬上送出SQL語句。可以使用

OraclePreparedStatement.setExecuteBatch()來設定批量送出數目,當達到這個數值以前,并不會送出SQL語句,

隻有達到設定值或者執行OraclePreparedStatment.sendBatch()方法後才會送出這之前的所有語句。注意,LONG和

LONG   ROW類型同樣不支援批量送出功能。  

  //使用Thin類型連接配接到資料庫,傳回Connnection對象。  

  Connection   conn   =   DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl   ",   "bigmouse",   "mmouse");  

  //SQL語句  

  //id,   topic,   content,   post_date,   cat_name  

  String   strSql   =   "INSERT   INTO   my_article   VALUES   (bigmouse_seq.nextval,   ?,   ?,   sysdate,   'jsp')";  

  //建立PreparedStatement對象  

  PreparedStatement   pstmt   =   conn.prepareStatement(strSql);  

  //設定批量送出值  

  ((OraclePreparedStatement)pstmt).setExecuteBatch(3);  

  //顯示批量送出值  

  //Size=3  

  out.println("Size="   +   ((OraclePreparedStatement)pstmt).getExecuteBatch());  

  pstmt.setString(1,   "topic1");  

  pstmt.setString(2,   "content1");  

  //下面這條語句不會送出,因為未到批量送出設定值。  

  pstmt.executeUpdate();  

  pstmt.setString(1,   "topic2");  

  pstmt.setString(2,   "content2");  

  pstmt.setString(1,   "topic3");  

  pstmt.setString(2,   "content3");  

  //下面這條語句會送出  

  pstmt.setString(1,   "topic4");  

  pstmt.setString(2,   "content4");  

  //主動送出  

  ((OraclePreparedStatement)pstmt).sendBatch();  

  pstmt.close();  

  指定字段類型  

  當第一次送出SQL語句時,首先會确定結果集中的字段類型,當JDBC從結果集中取得資料時會進行轉換。可以事先指定字段類型,這樣可以提高效率。  

  Statement   stmt   =   conn.createStatement();  

  //先清除以前的定義  

  ((OracleStatement)stmt).clearDefines();  

  //将NUMBER類型轉成String類型  

  ((OracleStatement)stmt).defineColumnType(1,   Types.VARCHAR);  

  ResultSet   rs   =   stmt.executeQuery("SELECT   id   FROM   my_article");