包 javax.sql
java.sql
包,从 1.4 版开始,它包含在 Java 平台标准版 (Java SE) 中。它仍然是 Java 平台企业版 (Java EE) 的重要组成部分。
javax.sql
包提供以下内容:
DataSource
接口作为DriverManager
的替代,用于与数据源建立连接- 连接池和语句池
- 分布式事务
- 行集
应用程序直接使用 DataSource
和 RowSet
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.commit
或 Connection.rollback
方法,也不能将连接设置为自动提交模式(即,它不能调用 Connection.setAutoCommit(true)
)。
应用程序不需要做任何特殊的事情来参与分布式事务。它只是像往常一样通过 DataSource.getConnection
方法创建到它想要使用的数据源的连接。事务管理器在幕后管理事务。 XADataSource
接口创建 XAConnection
对象,每个 XAConnection
对象创建一个 XAResource
对象,事务管理器使用它来管理连接。
行集
RowSet
接口在幕后与各种其他类和接口一起工作。这些可以分为三类。
- 事件通知
RowSetListener
RowSet
对象是 JavaBeans 组件,因为它具有属性并参与 JavaBeans 事件通知机制。RowSetListener
接口由一个组件实现,该组件希望收到有关特定RowSet
对象发生的事件的通知。这样的组件通过RowSet.addRowSetListener
方法将自己注册为具有行集的监听器。当
RowSet
对象更改其中一行、更改所有行或移动其光标时,它还会通知向其注册的每个监听器。监听器通过执行在其上调用的通知方法的实现来做出反应。RowSetEvent
作为其内部通知过程的一部分,RowSet
对象创建RowSetEvent
的实例并将其传递给监听器。监听器可以使用此RowSetEvent
对象找出哪个行集有事件。
- 元数据
RowSetMetaData
此接口派生自ResultSetMetaData
接口,提供有关RowSet
对象中的列的信息。应用程序可以使用RowSetMetaData
方法来查明行集包含多少列以及每列可以包含哪种数据。RowSetMetaData
接口提供了设置列信息的方法,但应用程序通常不会使用这些方法。当应用程序调用RowSet
方法execute
时,RowSet
对象将包含一组新行,其RowSetMetaData
对象将在内部更新以包含有关新列的信息。
- 读者/作家设施
实现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 教程和参考,第三版”
-
类描述定义
DataSource
、XADataSource
和ConnectionPoolDataSource
之间通用方法的接口。一个Event
对象,提供有关连接相关事件源的信息。一个对象,用于注册接收PooledConnection
对象生成的事件通知。PooledConnection
对象的工厂。用于连接到此DataSource
对象表示的物理数据源的工厂。为连接池管理提供挂钩的对象。从ConnectionPoolDataSource
对象创建的构建器,用于建立与data source
对象代表的数据库的连接。添加对 JavaBeans 组件模型的 JDBC API 支持的接口。RowSet
对象发生事件时生成的Event
对象。RowSet
对象实现的接口,以便将其自身呈现给RowSetReader
或RowSetWriter
对象。一个必须由希望在RowSet
对象的生命周期中发生重大事件时得到通知的组件实现的接口。包含有关RowSet
对象中列的信息的对象。断开连接的RowSet
对象调用以用数据行填充自身的设施。实现RowSetWriter
接口的对象,称为writer.一个StatementEvent
被发送到所有在PooledConnection
注册的StatementEventListener
。一个对象,它注册以接收语句池中 PreparedStatements 上发生的事件的通知。为分布式事务提供支持的对象。从XADataSource
对象创建的构建器,用于建立与data source
对象代表的数据库的连接。内部使用的XAConnection
对象的工厂。