J2EE1.4新特性之JDBC3.0的新特性 |
作者:佚名 发布时间:2005-04-02 来源:不详
|
JDBC3.0规范中通过提 连接池的实现,而连接池的 不同角色的开发人员共同实
|
供了一个支持数据库连接池的框 具体实现JDBC 3.0规范并没有做 现数据库连接池。
|
架,这个框架仅仅规定了如何支持 相关的规定。通过这个框架可以让
|
通过JDBC3.0规范可以 Application Server级。在 JDBC Drvier的开发人员来 也必须对数据库连接池进行 定数据库厂商的JDBC Drive 池的实现(但是现在大多数 ),其中特定数据库厂商的 Server厂商提供数据库连接
|
知道具体数据库连接池的实现可 JDBC Driver级的实现中任何相 具体实现,即JDBC Driver既需 具体实现。而在Application Se r开发人员和Application Serve Application Server厂商实现的 JDBC Driver提供数据库连接池 池的具体实现。
|
以分为JDBC Driver级和 关的工作均由特定数据库厂商的 要提供对数据库连接池的支持同时 rver级中数据库连接池的实现中特 r开发人员来共同实现数据库连接 连接池的机制和规范中提到有差异 的支持而特定的Application
|
JDBC3.0规范规定了如下的类和接口来支持数据库连接池的实现。 |
javax.sql.ConnectionEvent |
javax.sql.ConnectionPoolDataSource |
javax.sql.PooledConnection |
javax.sql.ConnectionEventListener |
其中除javax.sql.Conn
|
ectionEvent是类,其它的均为
|
接口。
|
通过此图可以大概的了解相关接口在一个典型的三层环境中应用程序的位置。 |
为了解决对获取自动产生的或自动增 这种值变得很轻松。要确定任何所产生的 中指定一个可选的标记,表示您有兴趣获 Statement.RETURN_GENERATED_KEYS,也 语句后,所产生的关键字的值就会通过从 索 ResultSet 而获得,ResultSet 包含 的作者并返回对应的自动产生的关键字。
|
加的关键字的值的需求,JDBC 3.0 API 现在将获取 关键字的值,只要简单地在语句的 execute() 方法 取产生的值。您感兴趣的程度可以是 可以是 Statement.NO_GENERATED_KEYS。在执行这条 Statement 的实例方法 getGeneratedKeys() 来检 了每个所产生的关键字的列,下面的示例创建一个新
|
Statement stmt = conn.createStat
|
ement();
|
// Obtain the genera
|
ted key that results from th
|
e query.
|
stmt.executeUpdate("INSERT INTO
|
authors " +
|
"(first_name, last_name) " + |
Statement.RETURN_GENERATED_KEYS); |
ResultSet rs = stmt.
|
getGeneratedKeys();
|
// Retrieve the auto generated key(s). |
JDBC 2 规范的一个局 。作为 JDBC 3.0 规范中改 ResultSets。然而,重要的 的 ResultSet。所以,要支 getMoreResults() 方法。 指定前一次打开的 ResultS
|
限是,在任意时刻,返回多重结 变的一个部分,规范将允许 Sta 是 execute() 方法仍然会关闭 持多重打开的结果,Statement 新式的方法会做一个整数标记, et 的行为。接口将按如下所示
|
果的语句只能打开一个 ResultSet tement 接口支持多重打开的 任何以前 execute() 调用中打开 接口就要加上一个重载的 在 getResultSet() 方法被调用时 定义标记:
|
CLOSE_ALL_RESULTS: 都将被关闭。
|
当调用 getMoreResults() 时,
|
所有以前打开的 ResultSet 对象
|
CLOSE_CURRENT_RESULT:当调用 get 闭。
|
MoreResults() 时,当前的 ResultSet 对象将被关
|
KEEP_CURRENT_RESULT:当调用 getM 关闭。
|
oreResults() 时,当前的 ResultSet 对象将不会被
|
// Set the value of
|
procCall to call a stored pr
|
ocedure.
|
CallableStatement cs
|
tmt = connection.prepareCall
|
(procCall);
|
int retval = cstmt.execute(); |
// The statement returned an upd
|
ate count, so handle it.
|
ResultSet rs1 = cstmt.getResultSet(); |
retval = cstmt.getMo
|
reResults(Statement.KEEP_CUR
|
RENT_RESULT);
|
ResultSet rs2 = cstmt.getResultSet(); |
// Both ResultSets a
|
re open and ready for use.
|
也许在 JDBC 3.0 中最令人兴奋的附 开发人员可以控制对数据的并发访问,从 时候需要的是对事务多一点的控制,而不 JDBC 3.0 下,可以通过 Savepoint 获得 逻辑断点,以控制有多少事务需要回滚。
|
加特点就是 Savepoint 了。JDBC 2 中的事务支持让 而保证持续数据总是保持一致的状态。可惜的是,有 是在当前的事务中简单地对每一个改变进行回滚。在 这种控制。Savepoint 接口允许您将事务分割为各个 下图3 将说明如何在事务中运用 Savepoint。
|
你或许不是经常需要使 用,那就是您需要作一系列 哪一部分。下面的代码示例
|
用 Savepoint。然而,在一种普 的改变,但是在知道所有的结果 说明了如何使用 Savepoint 接
|
遍的情况下 Savepoint 会发挥作 之前不能确定应该保留这些改变的 口。
|
conn.setAutoCommit(false); |
// Set a conservative transactio
|
n isolation level.
|
conn.setTransactionI
|
solation(Connection.TRANSACT
|
ION_SERIALIZABLE);
|
Statement stmt = con
|
n.createStatement();
|
int rows = stmt.executeUpdate( "
|
INSERT INTO authors " +
|
" (first_name, last_name) VALUES " + |
// Set a named savepoint. |
Savepoint svpt = con
|
n.setSavepoint("NewAuthor");
|
|
rows = stmt.executeUpdate( "UPDA
|
TE authors set type = 'fiction' " +
|
"WHERE last_name = 'Wxl'"); |
// The author has been added, bu
|
t not updated.
|
元数据 API 已经得到 构,一种新的 ParameterMe 性。
|
更新,DatabaseMetaData 接口 taData 接口可以描述 Prepared
|
现在可以检索 SQL 类型的层次结 Statement 对象中参数的类型和属
|
2)CallableStatements 中已命名的参数 |
在 JDBC 3.0 之前,设 。 CallableStatement 接
|
置一个存储过程中的一个参数要 口已经被更新了,现在您可以用
|
指定它的索引值,而不是它的名称 名称来指定参数。
|
JDBC 所支持的数据类型作了几个改变,其中之一是增加了两种新的数据类型。 |
为了便于修改 CLOB(Character Lar OBject,二进制巨对象)和 REF(SQL 结 下来的是,因为我们现在能够更新这些数 支持对这些数据类型的列的更新,也包括 java.sql.Types.DATALINK 和 java.sql. 类型。DATALINK 提供对外部资源的访问 同的,只是增加了在语义上的含义。DATA ResultSet 的一个实例中检索到的,而 B
|
ge OBject,字符型巨对象)、BLOB(Binary Large 构)类型的值,同名的数据类型接口都被更新了。接 据类型的值,所以 ResultSet 接口也被修改了,以 对 ARRAY 类型的更新。增加的两种新的数据类型是 Types.BOOLEAN。新增的数据类型指的是同名的 SQL 或 URL,而 BOOLEAN 类型在逻辑上和 BIT 类型是等 LINK 列值是通过使用新的 getURL() 方法从 OOLEAN 类型是通过使用 getBoolean() 来检索的。
|
|
|
|
|
|