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.registerDriver(new   oracle.jdbc.driver.OracleDriver());  
  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  
  {  
  //註冊驅動  
  DriverManager.registerDriver(new   oracle.jdbc.driver.OracleDriver());  
   
  //使用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);  
   
  //顯示默認預取行值和剛創建的Statement的預取值  
  //Default=5;Current=3  
  out.println("Default="   +   conn.getDefaultRowPrefetch()   +   ";Current="   +   stmt.getRowPrefetch());  
  out.println("<br><br>");  
   
  //獲得結果集  
  rs   =   stmt.executeQuery("SELECT   topic   FROM   my_article");  
   
  while   (rs.next())  
  {  
  out.println(rs.getString(1));  
  out.println("<br>");  
  }  
   
  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類型同樣不支持批量提交功能。  
   
  一個例子:  
  <%@   page    
  import="java.sql.*,  
  oracle.jdbc.driver.*"  
  %>  
   
  <%  
  try  
  {  
  //註冊驅動  
  DriverManager.registerDriver(new   oracle.jdbc.driver.OracleDriver());  
   
  //使用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());  
  out.println("<br><br>");  
   
  pstmt.setString(1,   "topic1");  
  pstmt.setString(2,   "content1");  
  //下面這條語句不會提交,因爲未到批量提交設定值。  
  pstmt.executeUpdate();  
   
  pstmt.setString(1,   "topic2");  
  pstmt.setString(2,   "content2");  
  //下面這條語句不會提交,因爲未到批量提交設定值。  
  pstmt.executeUpdate();  
   
  pstmt.setString(1,   "topic3");  
  pstmt.setString(2,   "content3");  
  //下面這條語句會提交  
  pstmt.executeUpdate();  
   
  pstmt.setString(1,   "topic4");  
  pstmt.setString(2,   "content4");  
  //下面這條語句不會提交,因爲未到批量提交設定值。  
  pstmt.executeUpdate();  
   
  //主動提交  
  ((OraclePreparedStatement)pstmt).sendBatch();  
   
  pstmt.close();  
  conn.close();  
  }  
  catch   (Exception   e)  
  {  
  out.println(e.getMessage());  
  }  
  %>  
   
  指定字段類型  
   
  當第一次提交SQL語句時,首先會確定結果集中的字段類型,當JDBC從結果集中取得數據時會進行轉換。可以事先指定字段類型,這樣可以提高效率。  
   
  一個例子:  
  <%@   page    
  import="java.sql.*,  
  oracle.jdbc.driver.*"  
  %>  
   
  <%  
  try  
  {  
  //註冊驅動  
  DriverManager.registerDriver(new   oracle.jdbc.driver.OracleDriver());  
   
  //使用Thin類型連接到數據庫,返回Connnection對象。  
  Connection   conn   =   DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl   ",   "bigmouse",   "mmouse");  
   
  Statement   stmt   =   conn.createStatement();  
   
  //先清除以前的定義  
  ((OracleStatement)stmt).clearDefines();  
   
  //將NUMBER類型轉成String類型  
  ((OracleStatement)stmt).defineColumnType(1,   Types.VARCHAR);  
   
  //獲得結果集  
  ResultSet   rs   =   stmt.executeQuery("SELECT   id   FROM   my_article");  
   
  while   (rs.next())  
  {  
  out.println(rs.getString(1));  
  out.println("<br>");  
  }  
   
  rs.close();  
  stmt.close();  
  conn.close();  
  }  
  catch   (Exception   e)  
  {  
  out.println(e.getMessage());  
  }  
  %>  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章