Module java.sql

Package javax.sql


package javax.sql
提供了从Java编程语言访问和处理服务器端数据源的API。该包是对java.sql包的补充,并且自1.4版本发布以来,已包含在Java平台标准版(Java SE)中。它仍然是Java平台企业版(Java EE)的一个重要部分。

javax.sql包提供以下功能:

  1. DataSource接口作为与数据源建立连接的DriverManager的替代方法
  2. 连接池和语句池
  3. 分布式事务
  4. Rowsets

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

使用DataSource对象建立连接

javax.sql包提供了使用数据源建立连接的首选方法。原始机制DriverManager类仍然有效,使用它的代码将继续运行。然而,较新的DataSource机制更受欢迎,因为它相对于DriverManager机制具有许多优势。

使用DataSource对象建立连接的主要优势包括:

  • 可以更改数据源的属性,这意味着当数据源或驱动程序发生变化时,无需在应用程序代码中进行更改。
  • 通过与中间层基础设施配合使用的DataSource对象提供连接和语句池以及分布式事务。通过DriverManager创建的连接不具有连接和语句池或分布式事务功能。

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

数据源的逻辑名称注册在使用Java命名和目录接口(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池化,对于PreparedStatements,可以通过调用方法DatabaseMetaData.supportsStatementPooling来确定,连接池管理器将作为StatementEventListener对象注册到新的PooledConnection对象。当PreparedStatement关闭或出现错误时,连接池管理器(作为监听器)会收到包含StatementEvent对象的通知。

分布式事务

与池化连接一样,通过实现与中间层基础设施配合使用的DataSource对象创建的连接可能参与分布式事务。这使应用程序能够在单个事务中涉及多个服务器上的数据源。

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

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

XAConnection接口派生自PooledConnection接口,因此适用于池化连接的内容也适用于分布式事务中的连接。中间层的事务管理器会自动处理所有事务。应用程序代码的唯一更改是应用程序不能执行任何可能干扰事务管理器处理事务的操作。具体而言,应用程序不能调用Connection.commitConnection.rollback方法,并且不能将连接设置为自动提交模式(即不能调用Connection.setAutoCommit(true))。

应用程序无需采取任何特殊措施即可参与分布式事务。它只需通过DataSource.getConnection方法创建到要使用的数据源的连接,就像通常那样。事务管理器在幕后管理事务。XADataSource接口创建XAConnection对象,每个XAConnection对象创建一个XAResource对象,事务管理器使用该对象来管理连接。

Rowsets

RowSet接口与幕后的各种其他类和接口一起工作。这些可以分为三类。
  1. 事件通知
    • RowSetListener
      一个RowSet对象是一个JavaBeans组件,因为它具有属性并参与JavaBeans事件通知机制。 RowSetListener接口由希望被通知特定RowSet对象发生的事件的组件实现。这样的组件通过RowSet.addRowSetListener方法向rowset注册自己作为监听器。

      RowSet对象更改其行之一,更改其所有行或移动其光标时,它还会通知注册在其上的每个监听器。监听器通过执行其实现的通知方法来做出反应。

    • RowSetEvent
      作为其内部通知过程的一部分,RowSet对象创建一个RowSetEvent实例并将其传递给监听器。监听器可以使用这个RowSetEvent对象来找出哪个rowset发生了事件。
  2. 元数据
    • RowSetMetaData
      这个接口从ResultSetMetaData接口派生,提供有关RowSet对象中列的信息。应用程序可以使用RowSetMetaData方法来找出rowset包含多少列以及每列可以包含什么类型的数据。

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

  3. 读取器/写入器设施
    实现RowSetInternal接口的RowSet对象可以调用与其关联的RowSetReader对象来填充自身数据。它还可以调用与其关联的RowSetWriter对象将其行的任何更改写回最初获取行的数据源。保持连接到其数据源的rowset不需要使用读取器和写入器,因为它可以直接在数据源上操作。
    • RowSetInternal
      通过实现RowSetInternal接口,RowSet对象可以访问其内部状态,并能够调用其读取器和写入器。rowset跟踪其当前行中的值以及紧随其后的值,称为原始值。rowset还跟踪(1)为其命令设置的参数和(2)传递给它的连接(如果有的话)。应用程序通常不直接调用这些方法,rowset在后台使用RowSetInternal方法来访问这些信息。
    • RowSetReader
      实现了RowSetInternal接口的断开连接的RowSet对象可以调用其读取器(与其关联的RowSetReader对象)来填充数据。当应用程序调用RowSet.execute方法时,该方法调用rowset的读取器来完成大部分工作。实现可以有很大的变化,但通常读取器建立与数据源的连接,从数据源读取数据并将其填充到rowset中,然后关闭连接。读取器还可以更新其rowset的RowSetMetaData对象。rowset的内部状态也会更新,无论是由读取器还是直接由方法RowSet.execute
    • RowSetWriter
      实现了RowSetInternal接口的断开连接的RowSet对象可以调用其写入器(与其关联的RowSetWriter对象)将更改写回底层数据源。实现可能有很大的变化,但通常,写入器将执行以下操作:
      • 建立与数据源的连接
      • 检查是否存在冲突,即在rowset中已更改的值是否也在数据源中更改
      • 如果没有冲突,则将新值写入数据源
      • 关闭连接

RowSet接口可以以任意数量的方式实现,任何人都可以编写实现。鼓励开发人员发挥想象力,提出使用rowsets的新方法。

包规范

由Addison-Wesley Longman出版的Java系列书籍提供了有关javax.sql包中类和接口的详细信息:

  • JDBC™API 教程与参考,第三版
  • Class
    Description
    定义了在 DataSourceXADataSourceConnectionPoolDataSource 之间共同的方法的接口。
    提供有关连接相关事件源的信息的 Event 对象。
    注册以通知由 PooledConnection 对象生成的事件的对象。
    PooledConnection 对象的工厂。
    用于连接到此 DataSource 对象表示的物理数据源的连接工厂。
    提供连接池管理钩子的对象。
    ConnectionPoolDataSource 对象创建的构建器,用于建立与 data source 对象表示的数据库的连接。
    为 JDBC API 添加对 JavaBeans 组件模型的支持的接口。
    当发生事件影响到 RowSet 对象时生成的 Event 对象。
    RowSet 对象实现的接口,以便向 RowSetReaderRowSetWriter 对象展示自身。
    必须由希望在 RowSet 对象的生命周期中发生重要事件时得到通知的组件实现的接口。
    包含 RowSet 对象中列信息的对象。
    断开连接的 RowSet 对象调用以填充自身数据行的设施。
    实现了 RowSetWriter 接口的对象,称为 writer
    发送给所有已在 PooledConnection 注册的 StatementEventListenerStatementEvent
    注册以通知在语句池中的 PreparedStatements 上发生的事件的对象。
    提供分布式事务支持的对象。
    XADataSource 对象创建的构建器,用于建立与 data source 对象表示的数据库的连接。
    用于内部使用的 XAConnection 对象的工厂。