模块 java.sql

包 javax.sql


javax.sql
提供用于从 Java 编程语言访问和处理服务端数据源的 API。此包补充了 java.sql 包,从 1.4 版开始,它包含在 Java 平台标准版 (Java SE) 中。它仍然是 Java 平台企业版 (Java EE) 的重要组成部分。

javax.sql 包提供以下内容:

  1. DataSource 接口作为 DriverManager 的替代,用于与数据源建立连接
  2. 连接池和语句池
  3. 分布式事务
  4. 行集

应用程序直接使用 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 对象时,连接池管理器将注册为新的 PooledConnection 对象的 ConnectionEventListener 对象。当连接关闭或出现错误时,连接池管理器(作为监听器)会收到包含 ConnectionEvent 对象的通知。

如果连接池管理器支持 Statement 池,对于 PreparedStatements ,这可以通过调用方法 DatabaseMetaData.supportsStatementPooling 来确定,连接池管理器将使用新的 PooledConnection 对象注册为 StatementEventListener 对象。当 PreparedStatement 关闭或出现错误时,连接池管理器(作为监听器)收到包含 StatementEvent 对象的通知。

分布式事务

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

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

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

XAConnection 接口派生自 PooledConnection 接口,因此适用于池连接的内容也适用于属于分布式事务的连接。中间层的事务管理器透明地处理所有事情。应用程序代码的唯一变化是应用程序不能做任何会干扰事务管理器处理事务的事情。具体来说,应用程序不能调用 Connection.commitConnection.rollback 方法,也不能将连接设置为自动提交模式(即,它不能调用 Connection.setAutoCommit(true) )。

应用程序不需要做任何特殊的事情来参与分布式事务。它只是像往常一样通过 DataSource.getConnection 方法创建到它想要使用的数据源的连接。事务管理器在幕后管理事务。 XADataSource 接口创建 XAConnection 对象,每个 XAConnection 对象创建一个 XAResource 对象,事务管理器使用它来管理连接。

行集

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

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

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

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

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

RowSet 接口可以通过多种方式实现,任何人都可以编写实现。鼓励开发人员发挥他们的想象力,想出使用行集的新方法。

包装规格

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

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