天天看点

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