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");