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