Oracle8JDBCDrivers
来源:互联网 发布:手机淘宝首页展示位置 编辑:程序博客网 时间:2024/06/06 02:48
Oracle8JDBCDrivers
Oracle8提供两种JDBCDriver,JDBCThin和JDBCOCI(OracleCallInterface)。JDBCThine是Type4Driver,JDBCOCI是Type2Driver。JDBC一共有4种类型的Driver:
Type1:JDBC-ODBC桥,将JDBC调用转换到ODBC调用。
Type2:使用本地API,将JDBC调用转换到特定的DBMS调用。
Type3:网络JDBC,将JDBC调用转换成与DBMS无关的网络协议,然后再转换成特定的DBMS协议。
Type4:本地JDBC,将JDBC调用直接转换成特定DBMS协议。
Type1和Type2需要在客户机安装特定的二进制代码,后两种Driver则不需要。因此JDBCOCIDriver不能用于Applet中,因为它调用C库,是与平台相关的,无法下载到客户机的未知平台浏览器中运行。对于Applet中访问数据库,只能用JDBCThineDriver。
关于JDBCOCIDriver
由于调用了本地C库,据说(Oracle一向比较能吹,不知道是不是真的@_@)效率很高,建议在Application中使用此种Driver。若要使用OCIDriver,必须在客户端安装OracleNet8才行。连接方法:
DriverManager.registerDriver(newOracle.jdbc.driver.OracleDriver());
DriverManager.getConnection("jdbc:Oracle:oci8:@(description=(address=(host=localhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl)))","bigmouse","mouse");
关于JDBCThinDriver
由于JDBCThinDriver使用TCP/IPSockets连接,因此必须先要启动OracleTNSListener服务。连接方法:
DriverManager.registerDriver(newOracle.jdbc.driver.OracleDriver());
DriverManager.getConnection("jdbc:Oracle:thin:@localhost:1521:orcl","bigmouse","mouse");
关于预取行(PrefetchingRows)
一般情况下,JDBC从结果集中一次只读取一行。可以使用OracleStatement.setRowPrefetch()指定特定Statement一次取出的行数,这可以提高JDBC的性能。使用OracleConnection.setDefaultRowPrefetch()可以指定所有Statement一次取出的行数,默认是10行。需要注意的是,Statement只在创建的时候从Connection获得预取行数,如果后来Connection改变了此值,则先前创建的Statement并不会自动跟着改变预取行数值。另外,对于LONG和LONGROW类型,设定预取行的值无效,JDBC每次只会取一行。
一个例子:
<%@page
import="java.sql.*,
Oracle.jdbc.driver.*"
%>
<%
try
{
//注册驱动
DriverManager.registerDriver(newOracle.jdbc.driver.OracleDriver());
//使用Thin类型连接到数据库,返回Connnection对象,并转换成OracleConnection对象。
OracleConnectionconn=(OracleConnection)DriverManager.getConnection("jdbc:Oracle:thin:@localhost:1521:orcl","bigmouse","mmouse");
//设定所有Statemnt预取5行
conn.setDefaultRowPrefetch(5);
//创建Statement对象,并从Connection获得默认预取行值5。
OracleStatementstmt=(OracleStatement)conn.createStatement();
//显示默认预取行值和刚创建的Statement的预取值
//Default=5;Current=5
out.println("Default="+conn.getDefaultRowPrefetch()+";Current="+stmt.getRowPrefetch());
out.println("
");
//获得结果集
ResultSetrs=stmt.executeQuery("SELECTtopicFROMmy_article");
while(rs.next())
{
out.println(rs.getString(1));
out.println("
");
}
//设定Statement的预取行,覆盖默认设置
stmt.setRowPrefetch(3);
//显示默认预取行值和刚创建的Statement的预取值
//Default=5;Current=3
out.println("Default="+conn.getDefaultRowPrefetch()+";Current="+stmt.getRowPrefetch());
out.println("
");
//获得结果集
rs=stmt.executeQuery("SELECTtopicFROMmy_article");
while(rs.next())
{
out.println(rs.getString(1));
out.println("
");
}
rs.close();
stmt.close();
conn.close();
}
catch(Exceptione)
{
out.println(e.getMessage());
}
%>
关于批量提交(BatchingUpdates)
默认情况下,当PreparedStatement执行executeUpdate()后,就会马上提交SQL语句。可以使用OraclePreparedStatement.setExecuteBatch()来设定批量提交数目,当达到这个数值以前,并不会提交SQL语句,只有达到设定值或者执行OraclePreparedStatment.sendBatch()方法后才会提交这之前的所有语句。注意,LONG和LONGROW类型同样不支持批量提交功能。
一个例子:
<%@page
import="java.sql.*,
Oracle.jdbc.driver.*"
%>
<%
try
{
//注册驱动
DriverManager.registerDriver(newOracle.jdbc.driver.OracleDriver());
//使用Thin类型连接到数据库,返回Connnection对象。
Connectionconn=DriverManager.getConnection("jdbc:Oracle:thin:@localhost:1521:orcl","bigmouse","mmouse");
//SQL语句
//id,topic,content,post_date,cat_name
StringstrSql="INSERTINTOmy_articleVALUES(bigmouse_seq.nextval,?,?,sysdate,'jsp')";
//创建PreparedStatement对象
PreparedStatementpstmt=conn.prepareStatement(strSql);
//设定批量提交值
((OraclePreparedStatement)pstmt).setExecuteBatch(3);
//显示批量提交值
//Size=3
out.println("Size="+((OraclePreparedStatement)pstmt).getExecuteBatch());
out.println("
");
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(Exceptione)
{
out.println(e.getMessage());
}
%>
指定字段类型
当第一次提交SQL语句时,首先会确定结果集中的字段类型,当JDBC从结果集中取得数据时会进行转换。可以事先指定字段类型,这样可以提高效率。
一个例子:
<%@page
import="java.sql.*,
Oracle.jdbc.driver.*"
%>
<%
try
{
//注册驱动
DriverManager.registerDriver(newOracle.jdbc.driver.OracleDriver());
//使用Thin类型连接到数据库,返回Connnection对象。
Connectionconn=DriverManager.getConnection("jdbc:Oracle:thin:@localhost:1521:orcl","bigmouse","mmouse");
Statementstmt=conn.createStatement();
//先清除以前的定义
((OracleStatement)stmt).clearDefines();
//将NUMBER类型转成String类型
((OracleStatement)stmt).defineColumnType(1,Types.VARCHAR);
//获得结果集
ResultSetrs=stmt.executeQuery("SELECTidFROMmy_article");
while(rs.next())
{
out.println(rs.getString(1));
out.println("
");
}
rs.close();
stmt.close();
conn.close();
}
catch(Exceptione)
{
out.println(e.getMessage());
}
%>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>