模块  java.sql

Package javax.sql

提供用于从Java™编程语言访问和处理服务器端数据源的API。 该软件包是对java.sql软件包的补充,从版本1.4发行版开始,它包含在Java平台标准版(JavaSEâ“)中。 它仍然是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对象,连接池管理器将注册为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对象。

行集

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

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

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

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

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

RowSet接口可以以任何数量的方式实现,并且任何人都可以编写实现。 鼓励开发人员使用他们的想象力来提出使用行集的新方法。

包装规格

相关文档

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