Chinaunix首页 | 论坛 | 博客
  • 博客访问: 539330
  • 博文数量: 260
  • 博客积分: 10435
  • 博客等级: 上将
  • 技术积分: 1939
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-24 14:50
文章分类

全部博文(260)

文章存档

2011年(22)

2010年(209)

2009年(29)

我的朋友

分类: Java

2010-11-16 19:49:08

先看看thin和oci的url写法上的区别: 
jdbc:oracle:thin:@server ip: service 
jdbc:oracle:oci:@service 
1)从使用上来说,oci必须在客户机上安装oracle客户端或才能连接,而thin就不需要,因此从使用上来讲thin还是更加方便,这也是thin比较常见的原因。 
2)原理上来看,thin是纯java实现tcp/ip的c/s通讯;而oci方式,客户端通过native java method调用c library访问服务端,而这个c library就是oci(oracle called interface),因此这个oci总是需要随着oracle客户端安装(从oracle10.1.0开始,单独提供OCI Instant Client,不用再完整的安装client) 
3)它们分别是不同的驱动类别,oci是二类驱动, thin是四类驱动,但它们在功能上并无差异。 
4)虽然很多人说oci的速度快于thin,但找了半天没有找到相关的测试报告。


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( "

");

//获得结果集
ResultSet   rs   =   stmt.executeQuery( "SELECT   topic   FROM   my_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( "SELECT   topic   FROM   my_article ");

while   (rs.next())
{
out.println(rs.getString(1));
out.println( "
");
}

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( "

");

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

rs.close();
stmt.close();
conn.close();
}
catch   (Exception   e)
{
out.println(e.getMessage());
}
%>

阅读(768) | 评论(0) | 转发(0) |
0

上一篇:java servlet

下一篇:java future

给主人留下些什么吧!~~