javax.sql

接口
为通过 Java TM 编程语言进行服务器端数据源访问和处理提供 API。

请参见:
          描述

接口摘要
CommonDataSource 此接口定义在 DataSourceXADataSourceConnectionPoolDataSource 之间公用的方法。
ConnectionEventListener 注册该对象便可获得由 PooledConnection 对象生成的事件的通知。
ConnectionPoolDataSource PooledConnection 对象的工厂。
DataSource 该工厂用于提供到此 DataSource 对象所表示的物理数据源的连接。
PooledConnection 为连接池管理提供钩子 (hook) 的对象。
RowSet 该接口添加了对 JavaBeansTM 组件模型的 JDBC API 支持。
RowSetInternal 为了将自身呈现给 RowSetReaderRowSetWriter 对象的 RowSet 对象实现应实现该接口。
RowSetListener 要在 RowSet 对象的生命周期内发生重要事件时得到通知的组件必须实现该接口。
RowSetMetaData 该对象包含关于 RowSet 对象的列的信息。
RowSetReader 该设施供非连接 RowSet 对象调用以填充数据行。
RowSetWriter 实现 RowSetWriter 接口的对象,称为 writer
StatementEventListener 注册为能获得 Statement 池中 PreparedStatement 上所发生事件的通知的对象。
XAConnection 为分布式事务提供支持的对象。
XADataSource 在内部使用的 XAConnection 对象的工厂。
 

类摘要
ConnectionEvent 提供关于连接相关事件的源信息的 Event 对象。
RowSetEvent RowSet 对象发生事件时生成的 Event 对象。
StatementEvent StatementEvent 被传送给所有用 PooledConnection 注册的 StatementEventListener
 

软件包 javax.sql 的描述

为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API。此包补充了 java.sql 包,它从 1.4 版本开始包含在 Java 平台、标准版 (Java SETM) 中。它保留了 Java 平台、企业版 (Java EETM) 中的精华部分。

java.sql 包中提供以下内容:

  1. DataSource 接口,用于建立到数据源的连接,是 DriverManager 的替代项。
  2. 连接池和语句池
  3. 分布式事务
  4. Rowset

应用程序直接使用 DataSourceRowSet API,但连接池和分布式事务 API 只能由中间层基础设施在内部使用。

使用 DataSource 对象建立连接

javax.sql 包提供建立到数据源的连接的首选方式。 DriverManager 类(原始机制)仍然有效,使用它的代码将继续运行。然而,与 DriverManager 机制相比,较新的 DataSource 机制更为可取,因为有更多的优点。

下面是使用 DataSource 对象建立连接的主要优点:

  • 可以对数据源的属性进行更改,这意味着当数据源或驱动程序发生更改时,不必更改应用程序代码。
  • 通过已实现为与中间层基础设施一起使用的 DataSource 对象,可获得连接池、语句池和分布式事务。通过 DriverManager 建立的连接不具有连接池和语句池或分布式事务功能。

驱动程序提供 DataSource 实现。特定的 DataSource 对象表示特定的物理数据源,DataSource 对象创建的每个连接都是到该物理数据源的连接。

数据源的逻辑名称需要向使用 Java Naming and Directory InterfaceTM (JNDI) API 的命名服务注册,通常由系统管理员或某个执行系统管理员职责的人执行。应用程序可以通过查找注册的逻辑名称获取它需要的 DataSource 对象。然后,应用程序可以使用 DataSource 对象创建到它所表示物理数据源的连接。

DataSource 对象可以实现为与中间层设施一起使用,这样可将它生成的连接入池以供重用。使用这种 DataSource 实现的应用程序将自动获取参与连接池的连接。DataSource 对象也可以实现为与中间层设施一起使用,这样无需要任何特殊编码即可将它所生成连接用于分布式事务。

连接池和语句池

通过实现为与中间层连接池管理器一起使用的 DataSource 对象建立的连接将参与连接池。这能显著地提高性能,因为创建新连接开销很大。连接池允许使用和重用连接,因此可以极大地减少需要创建的新连接数。

连接池是完全透明的。此操作是在中间层 Java EE 配置中自动完成的,因此就应用程序而言,无需对代码进行任何更改。应用程序可以简单地使用 DataSource.getConnection 方法获取入池连接,并按使用任何 Connection 对象相同的方式使用该连接。

用于连接池的类和接口是:

  • ConnectionPoolDataSource
  • PooledConnection
  • ConnectionEvent
  • ConnectionEventListener
  • StatementEvent
  • StatementEventListener
连接池管理器(三层体系结构的中间层中的设施)在后台使用这些类和接口。当调用 ConnectionPoolDataSource 对象创建 PooledConnection 对象时,连接池管理器将作为 ConnectionEventListener 对象在新 PooledConnection 对象中注册。当关闭连接或发生错误时,连接池管理器(作为侦听器)获取包括 ConnectionEvent 对象在内的通知。

如果连接池管理器支持 Statement 池,则对于可以通过调用 DatabaseMetaData.supportsStatementPooling 方法确定的 PreparedStatements,连接池管理器将向新 PooledConnection 对象注册为 StatementEventListener 对象。当 PreparedStatement 关闭或者发生错误时,连接池管理器(作为一个侦听器)获取一个通知,该通知包括 StatementEvent 对象。

分布式事务

与入池连接一样,通过实现为与中间层基础设施一起使用的 DataSource 对象建立的连接可参与分布式事务。这为应用程序提供了在单个事务中占用多个服务器上的数据源的能力。

用于分布式事务的类和接口是:

  • XADataSource
  • XAConnection
这些接口由事务管理器使用;应用程序不直接使用它们。

XAConnection 接口是从 PooledConnection 接口派生的,因此适用于入池连接的内容也适用于作为分布式事务一部分的连接。中间层中的事务管理器透明地处理所有动作。应用程序代码中的唯一变化是,应用程序不能执行任何与事务管理器对事务的处理有冲突的操作。更明确地说,应用程序不能调用方法 Connection.commitConnection.rollback,并且它不能将连接设置为自动提交模式(即它不能调用 Connection.setAutoCommit(true))。

应用程序不必为参与分布式事务而执行任何特殊操作。它只需要通过 DataSource.getConnection 方法创建到所需的数据源的连接,就跟它通常的做法一样。事务管理器在后台管理事务。XADataSource 接口创建 XAConnection 对象,每个 XAConnection 对象创建事务管理器用于管理连接的 XAResource 对象。

Rowset

RowSet 接口在后台与各种其他类和接口一起使用。RowSet 可分为三个类别。
  1. 事件通知
    • RowSetListener
      RowSet 对象是 JavaBeansTM 组件,因为它具有属性并参与 JavaBeans 事件通知机制。RowSetListener 接口由希望在特定 RowSet 对象发生事件时获得通知的组件实现。这种组件通过 RowSet.addRowSetListener 方法在 rowset 中作为侦听器注册。

      RowSet 对象更改它的其中一行、所有行或者移动其指针时,它将同时通知向它注册的所有侦听器。侦听器通过执行对它调用的通知方法的实现作出反应。

    • RowSetEvent
      作为内部通知进程的一部分,RowSet 对象创建一个 RowSetEvent 的实例并将其传递到侦听器。侦听器可以使用此 RowSetEvent 对象来找出具有该事件的 rowset。

  2. 元数据
    • RowSetMetaData
      此接口从 ResultSetMetaData 接口派生而来,提供关于 RowSet 对象中的列的信息。应用程序可以使用 RowSetMetaData 方法来找出 rowset 包含的列数和每列可以包含的数据种类。

      RowSetMetaData 接口提供用于设置关于列的信息的方法,但是应用程序通常不使用这些方法。当应用程序调用 RowSet 方法 execute 时,RowSet 对象将包含新的行设置,并且其 RowSetMetaData 对象将在内部被更新,以包含关于新行的信息。

  3. Reader/Writer 设施
    实现 RowSetInternal 接口的 RowSet 对象可以调用与之关联的 RowSetReader 对象来填充数据。它还可以调用与之关联的 RowSetWriter 对象将对其行所做的任何更改写回数据源,它的行最初便是从该数据源获取的。保持连接到其数据源的 rowset 不需要使用 reader 和 writer,因为它可以直接对数据源进行操作。
    • RowSetInternal
      通过实现 RowSetInternal 接口,RowSet 对象获取对其内部状态的访问权限,并且能够调用其 reader 和 writer。rowset 关注其当前行的值和当前行之前那个行的值(称为原始 值)。rowset 还关注:(1)已经设置的用于命令的参数(2)传递给它的连接(如果有)。rowset 在后台使用 RowSetInternal 方法获取对此信息的访问权限。应用程序通常不直接调用这些方法。

    • RowSetReader
      已经实现 RowSetInternal 接口的非连接 RowSet 对象可以调用其 reader(与之关联的 RowSetReader 对象)来填充数据。当应用程序调用 RowSet.execute 方法时,该方法调用 rowset 的 reader 来执行大多数操作。实现与实现可能大不相同,但一般过程是:reader 建立到数据源的连接,从数据源读取数据并使用该数据填充 rowset,然后关闭连接。reader 还可能更新其 rowset 的 RowSetMetaData 对象。rowset 的内部状态也将被更新,或者由 reader 进行或者由 RowSet.execute 方法直接进行。
    • RowSetWriter
      已经实现 RowSetInternal 接口的非连接 RowSet 对象可以调用其 writer(与之关联的 RowSetWriter 对象)将更改写回底层数据源。实现与实现可能大不相同,但一般情况下,writer 将执行以下操作:

      • 建立到数据源的连接
      • 检查是否存在冲突,即了解曾经在 rowset 中更改的值是否在数据源中也进行了更改
      • 如果不存在冲突,则将新值写入数据源
      • 关闭连接

RowSet 接口可以使用多种方式实现,任何人都可以编写实现。鼓励开发人员充分发挥想象力,探索使用 rowset 的新方式。

重要注意事项:对于使用标记有 "Since 1.6" 的 API,必须使用实现 JDBC 4.0 API 的 JDBC 技术驱动程序才能运行。必须检查驱动程序文档,以确保它实现了所需使用的特定功能。

包规范

相关文档

由 Addison-Wesley Longman 出版的 Java 系列书提供关于 javax.sql 包中的类和实现的详细信息:

从以下版本开始:
1.4