到 Google 资讯主页   
EasyJF首页   资料   源码   软件    论坛   网站    
   使用帮助    
    该信息为本站MyRSS系统缓存内容,部分图片及附件有可能无法正常使用.easyjf.comJavaResearch无关,不对该信息负责.通过http://kb.csdn.net/keyword/java//../../java/Articles/200207/cffbf538-6513-4038-9c05-ba7d99be78d2.html访问该信息的原始内容.
页面功能  【加入收藏】 【推荐给朋友】 【字体:  】 【关闭】   
Oracle8 JDBC Drivers
作者: 来源:JavaResearch  发布时间:2002-07-27 00:00:00.0

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


 
相关文章
 
页面功能  【加入收藏】 【推荐给朋友】 【字体:  】 【关闭】   


EasyJF.com 2006 隐私政策 使用EasyJF前必读