`

jdbc 3.0 特性介绍

阅读更多
已经步入4.0时代了。不过依然有用3.0的用户。了解一下也是好的。

1.元数据 api
元数据 api 已经得到更新,databasemetadata 接口现在可以检索 sql 类型的层次结构,一种新的 parametermetadata 接口可以描述 preparedstatement 对象中参数的类型和属性。
callablestatements 中已命名的参数
在 jdbc 3.0 之前,设置一个存储过程中的一个参数要指定它的索引值,而不是它的名称。callablestatement 接口已经被更新了,现在您可以用名称来指定参数。

2.数据类型的改变
jdbc 所支持的数据类型作了几个改变,其中之一是增加了两种新的数据类型。
为了便于修改 clob(character large object,字符型巨对象)、blob(binary large object,二进制巨对象)和 ref(sql 结构)类型的值,同名的数据类型接口都被更新了。接下来的是,因为我们现在能够更新这些数据类型的值,所以 resultset 接口也被修改了,以支持对这些数据类型的列的更新,也包括对 array 类型的更新。
增加的两种新的数据类型是 java.sql.types.datalink 和 java.sql.types.boolean。新增的数据类型指的是同名的 sql 类型。datalink 提供对外部资源的访问或 url,而 boolean 类型在逻辑上和 bit 类型是等同的,只是增加了在语义上的含义。datalink 列值是通过使用新的 geturl() 方法从 resultset 的一个实例中检索到的,而 boolean 类型是通过使用 getboolean() 来检索的。
3.检索自动产生的关键字
为了解决对获取自动产生的或自动增加的关键字的值的需求,jdbc 3.0 api 现在将获取这种值变得很轻松。要确定任何所产生的关键字的值,只要简单地在语句的 execute() 方法中指定一个可选的标记,表示您有兴趣获取产生的值。您感兴趣的程度可以是 statement.return_generated_keys,也可以是 statement.no_generated_keys。在执行这条语句后,所产生的关键字的值就会通过从 statement 的实例方法 getgeneratedkeys() 来检索 resultset 而获得。resultset 包含了每个所产生的关键字的列。

示例代码. 检索自动产生的关键字


statement stmt = conn.createstatement();
// obtain the generated key that results from the query.
stmt.executeupdate("insert into authors " +
           "(first_name, last_name) " +
           "values (george, orwell)",
           statement.return_generated_keys);
resultset rs = stmt.getgeneratedkeys();
if ( rs.next() ) {
    // retrieve the auto generated key(s).
    int key = rs.getint();}
4.resultset 可保持性
一个可保持的游标(或结果),就是说该游标在包含它的事务被提交后,也不会自动地关闭。jdbc 3.0 增加了对指定游标可保持性的支持。要制定您 resultset 的可保持性,您必须在使用 createstatement()、preparestatement() 或 preparecall() 方法准备编写一条语句时就这么做。可保持性可以是下面常量中的一个。


hold_cursors_over_commit

resultset 对象(游标)没有被关闭;它们在提交操作得到显式的或隐式的执行以后仍保持打开的状态。



close_cursors_at_commit

resultset 对象(游标)在提交操作得到显式的或隐式的执行后被关闭。


总的来说,在事务提交之后关闭游标操作会带来更好的性能。除非您在事务结束后还需要该游标,否则您最好在执行提交操作后将其关闭。因为规范没有规定 resultset 的缺省的可保持性,所以具体行为还将取决于执行情况。然而,我希望在可以使用 jdbc 3.0 驱动程序时,大多数执行在事务结束后仍旧会关闭游标。

5.返回多重结果
jdbc 2 规范的一个局限是,在任意时刻,返回多重结果的语句只能打开一个 resultset。作为 jdbc 3.0 规范中改变的一个部分,规范将允许 statement 接口支持多重打开的 resultsets。然而,重要的是 execute() 方法仍然会关闭任何以前 execute() 调用中打开的 resultset。所以,要支持多重打开的结果,statement 接口就要加上一个重载的 getmoreresults() 方法。新式的方法会做一个整数标记,在 getresultset() 方法被调用时指定前一次打开的 resultset 的行为。接口将按如下所示定义标记:


close_all_results

当调用 getmoreresults() 时,所有以前打开的 resultset 对象都将被关闭。



close_current_result

当调用 getmoreresults() 时,当前的 resultset 对象将被关闭。



keep_current_result

当调用 getmoreresults() 时,当前的 resultset 对象将不会被关闭。



示例代码. 如何处理多重打开结果

连接池
jdbc 3.0 定义了几个标准的连接池属性。开发人员并不需要直接地用 api 去修改这些属性,而是通过应用服务器或数据存储设备来实现。由于开发人员只会间接地被连接池属性的标准化所影响,所以有利之处并不明显。然而,通过减少厂商特定设置的属性的数量并用标准化的属性来代替它们,开发人员能更容易地在不同厂商的 jdbc 驱动程序之间进行交换。另外,这些属性还允许管理员很好地优化连接池,从而使应用程序的性能特点发挥到极致。这些属性如下表所示。


属性名称描述



maxstatements

连接池可以保持打开的语句数目。



initialpoolsize

当池初始化时可以建立的物理连接的数目。



minpoolsize

池可以包含的物理连接的最小数目。



maxpoolsize

池可以包含的物理连接的最大数目。零指没有最大值。



maxidletime

持续时间,以秒计,指一个闲置的物理连接在被关闭前可以在池中停留的时间。零指没有限制。



propertycycle

间隔时间,以秒计,指连接池在执行其属性策略前可以等待的时间。


6.预备语句池
除了改进对连接池的支持以外,现在也能缓冲预备语句了。预备语句允许您用一条常用的 sql 语句然后预编译它,从而在这条语句被多次执行的情况下大幅度地提升性能。在另一个方面,建立一个 preparedstatement 对象会带来一定量的系统开销。所以,在理想情况下,这条语句的生命周期应该足够长,以补偿它所带来的系统开销。追求性能的开发人员有时候为了延长 preparedstatement 对象的生命周期会不惜扭曲他们的对象模型。jdbc 3.0 让开发人员不再为此担心,因为数据源层现在负责为预备语句进行缓存。
清单 3 将示范如何利用 jdbc 对预备语句池的支持。细心的读者可能会发现清单中的语句和普通 jdbc 2 的代码没什么两样。这是因为语句的缓冲是完全在内部实现的。这就意味着,在 jdbc 3.0 下,您现存的代码可以自动利用语句池。但可惜的是,这也意味着您将不能控制哪个预备语句将被缓冲,而只能控制被缓存的语句的数目。
清单 3. 缓冲预备语句


string insert_book_query =
    "insert into booklist " +
               "(author, title) " +
               "values (?, ?) ";
connection conn = apooledconnection.getconnection();
preparedstatement ps = conn.preparestatement(insert_book_query);
ps.setstring(1, "orwell, george");
ps.setstring(2, "1Array84");
ps.executeupdate();
ps.close();
conn.close();
// ...
conn = apooledconnection.getconnection();
// since the connection is from a pooledconnection, the data layer has
// the option to retrieve this statement from its statement pool,
// saving the vm from re-compiling the statement again.
preparedstatement cachedstatement = conn.preparestatemet(insert_book_query);
// ...

7.  在您的事务中使用 savepoint
也许在 jdbc 3.0 中最令人兴奋的附加特点就是 savepoint 了。jdbc 2 中的事务支持让开发人员可以控制对数据的并发访问,从而保证持续数据总是保持一致的状态。可惜的是,有时候需要的是对事务多一点的控制,而不是在当前的事务中简单地对每一个改变进行回滚。在 jdbc 3.0 下,您就可以通过 savepoint 获得这种控制。savepoint 接口允许您将事务分割为各个逻辑断点,以控制有多少事务需要回滚。图 1 将说明如何在事务中运用 savepoint。
图 1. savepoint 的直观表示

您或许不是经常需要使用 savepoint。然而,在一种普遍的情况下 savepoint 会发挥作用,那就是您需要作一系列的改变,但是在知道所有的结果之前不能确定应该保留这些改变的哪一部分。清单 4 中的代码示例说明了如何使用 savepoint 接口。
清单 4. 使用 savepoint


conn.setautocommit(false);
// set a conservative transaction isolation level.
conn.settransactionisolation(connection.transaction_serializable);
statement stmt = conn.createstatement();
int rows = stmt.executeupdate(
    "insert into authors " +
                 "(first_name, last_name) values " +
               "(lewis, carroll)");
// set a named savepoint.
savepoint svpt = conn.setsavepoint("newauthor");
// ...
rows = stmt.executeupdate(
    "update authors set type = fiction " +
                "where last_name = carroll");
// ...
conn.rollback(svpt);
// ...
// the author has been added, but not updated.
conn.commit();




string proccall;
// set the value of proccall to call a stored procedure.
// ...callablestatement cstmt = connection.preparecall(proccall);
int retval = cstmt.execute();
if (retval == false) {
    // the statement returned an update count, so handle it.
    // ...
}
else {
    // resultset
    resultset rs1 = cstmt.getresultset();
    // ...
    retval = cstmt.getmoreresults(statement.keep_current_result);
    if (retval == true) {
        resultset rs2 = cstmt.getresultset();
        // both resultsets are open and ready for use.
        rs2.next();
        rs1.next();
        // ...
    }
}
分享到:
评论

相关推荐

    JDBCDriver3.0.rar_jdbc driver 3.0_sql jdbc 3.0_sql server jdbc_s

    JDBC Driver 3.0支持的SQL Server特性包括: 1. **连接池管理**:通过连接池,可以有效地复用数据库连接,减少创建和关闭连接的开销,提高系统性能。 2. **预编译语句(PreparedStatement)**:预编译的SQL语句可以...

    sqljdbc 3.0及4.0

    首先,`sqljdbc 3.0`是为SQL Server 2000设计的一个版本,它支持JDBC 3.0规范。这个版本的驱动程序提供了一种高效、可靠的机制,让Java应用程序能够通过Java虚拟机(JVM)与SQL Server 2000建立连接。它包含了一系列...

    JDBC3.0 4.0规范

    1. **JDBC+3.0+数据库编程.pdf**:这本书可能详细介绍了JDBC 3.0的各个方面,包括如何使用新特性进行数据库编程,以及最佳实践和示例代码。 2. **jdbc4.2-fr-spec.pdf**:这可能是JDBC 4.2规范的官方文档,详细阐述...

    非常好的jdbc3.0

    JDBC3.0是JDBC的一个重要版本,引入了许多增强特性,提高了数据库访问的效率和灵活性。 在JDBC3.0中,主要的改进和新特性包括: 1. **Statement的改进**:新增了PreparedStatement和CallableStatement的addBatch()...

    SqlJDBC3.0和4.0

    JDBC3.0和JDBC4.0是两个重要的版本,它们在连接Java应用程序与Microsoft SQL Server 2005(对应JDBC3.0)和SQL Server 2008(对应JDBC4.0)方面起到了关键作用。 **JDBC3.0:连接SQL Server 2005** JDBC3.0是Java ...

    JDBC 3.0 数据库编程

    **JDBC 3.0 数据库编程** ...JDBC 3.0的这些特性使得Java程序员在处理数据库任务时更加高效,同时也提供了更强大的错误处理和事务管理机制。在实际项目中,熟练掌握JDBC 3.0能有效提升数据库操作的稳定性和性能。

    JDBC新特性(API3.0)

    Java 数据库连接(JDBC)3.0 版本是一个重要的升级,旨在增强与数据库的交互效率和灵活性。这一版本的API在原有的基础上进行了多方面的改进,以满足开发者的需求,并保持向后兼容性。 首先,元数据 API 的更新是3.0...

    SQL SERVER JDBC 3.0

    SQL Server JDBC 3.0是Java开发者用于连接和操作Microsoft SQL Server数据库的驱动程序。它遵循Java Database Connectivity (JDBC) API标准,使得Java应用程序能够与SQL Server进行交互,执行SQL查询,处理结果集,...

    jdbc3.0开发文档.rar_jdbc

    JDBC 3.0还包含了一些性能优化特性,如`Statement`的`batchUpdate()`方法、`PreparedStatement`的复用,以及`Connection`池的使用,都能显著提升应用性能。 通过深入学习和实践JDBC 3.0开发文档,开发者可以充分...

    sqljdbc 1.0 3.0 4.0

    标题中的"sqljdbc 1.0 3.0 4.0"指的是Microsoft SQL Server JDBC Driver的不同版本。JDBC(Java Database Connectivity)是Java编程语言中用于与数据库交互的一种标准接口,由Sun Microsystems(现为Oracle公司)...

    jdbc3.0doc.zip_java jdbc

    在这个"jdbc3.0doc.zip_java jdbc"压缩包中,包含了两份文件,分别是"jdbc-3_0-fr-spec.pdf"和"www.pudn.com.txt"。 "jdbc-3_0-fr-spec.pdf"很可能是JDBC 3.0规范的中文版文档,这份文档详细阐述了JDBC 3.0的所有...

    sqljdbc_3.0架包

    - 高级特性:sqljdbc_3.0支持MARS(Multiple Active Result Sets),允许在一个连接上并发执行多个SQL操作,提高并发性能。 - 错误处理:提供了SQLServerException类,用于捕获和处理与SQL Server交互时出现的异常...

    JDBC 3.0 高级变成

    《JDBC 3.0 高级编程》是一部深入探讨Java数据库连接(JDBC)技术的著作,尤其关注JDBC 3.0版本的特性与实践。本资源包含丰富的学习代码,旨在帮助开发者从初级到高级,全面掌握JDBC的核心知识。 JDBC是Java语言中...

    sqljdbc_3.0,4.0 连接sqlserver数据库使用的jar包

    相比于早期版本,sqljdbc4.jar引入了一些新特性,比如支持Java SE 6及以上版本,改进的性能,以及对更多SQL Server特性的支持。 使用sqljdbc4.jar,开发者可以按照以下步骤建立与SQL Server的连接: 1. 添加依赖:...

    sqljdbc_3.0.rar

    2. SQLJDBC 3.0特性: - 兼容性:SQLJDBC 3.0设计用于支持SQL Server 2005及以上版本,包括SQL Server 2008、2012、2014、2016、2019等,确保了广泛的后端数据库兼容性。 - 性能优化:相较于早期版本,3.0版进行了...

    sqljdbc_3.0

    SQL Server JDBC驱动3.0版本相比于早期版本可能引入了性能优化、新的功能特性和对SQL Server 2008特定功能的支持,比如对XML数据类型、存储过程、事务处理等方面的改进。对于开发与SQL Server 2008数据库交互的Java...

    JDBC 3.0 数据库编程 随书代码

    JDBC 3.0是JDBC规范的一个重要版本,它引入了许多改进和新特性,提高了数据库操作的效率和便捷性。本篇文章将围绕JDBC 3.0的核心知识点进行详细阐述,帮助开发者更好地理解和应用JDBC进行数据库编程。 **1. JDBC ...

    sqlserver2000JDBCdriver3.0

    sqljdbc4.jar是针对Java Development Kit (JDK) 1.6及更高版本的驱动,它支持Java SE 6的增强特性,如Statement的try-with-resources语法。而sqljdbc.jar则适用于JDK 1.4和1.5。因此,在引入驱动时,你需要根据你的...

Global site tag (gtag.js) - Google Analytics