Module  java.sql

Package 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对象,连接池管理器将注册为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的组件,因为它具有属性并参与到JavaBeans事件通知机制中。 RowSetListener接口由想要通知特定RowSet对象发生的事件的组件实现。 这样一个组件通过RowSet.addRowSetListener方法将其自身注册为具有行集的侦听器。

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

    • RowSetEvent
      作为其内部的通知过程的一部分,一个RowSet对象创建的实例RowSetEvent并将其传递给听者。 监听器可以使用此RowSetEvent对象来查找哪个行集具有事件。
  2. 元数据
    • RowSetMetaData
      该接口从ResultSetMetaData接口派生,提供有关RowSet对象中的列的信息。 应用程序可以使用RowSetMetaData方法来查找行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
      断开连接的RowSet已经实现对象RowSetInternal接口可在其写入器(呼叫RowSetWriter与它相关联的对象),以更改写入回底层数据源。 实施可能会有很大差异,但一般来说,作者将会做如下工作:
      • 连接数据源
      • 检查是否存在冲突,即是否在数据源中更改了行集中已更改的值
      • 如果没有冲突,请将新值写入数据源
      • 关闭连接

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

包装规格

相关文档

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