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調用。
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());
}
%>