Package javax.sql
java.sql
包的补充,并且自1.4版本发布以来,已包含在Java平台标准版(Java SE)中。它仍然是Java平台企业版(Java EE)的一个重要部分。
javax.sql
包提供以下功能:
DataSource
接口作为与数据源建立连接的DriverManager
的替代方法- 连接池和语句池
- 分布式事务
- Rowsets
应用程序直接使用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
对象时,连接池管理器将作为ConnectionEventListener
对象注册到新的PooledConnection
对象。当连接关闭或出现错误时,连接池管理器(作为监听器)会收到包含ConnectionEvent
对象的通知。
如果连接池管理器支持Statement
池化,对于PreparedStatements
,可以通过调用方法DatabaseMetaData.supportsStatementPooling
来确定,连接池管理器将作为StatementEventListener
对象注册到新的PooledConnection
对象。当PreparedStatement
关闭或出现错误时,连接池管理器(作为监听器)会收到包含StatementEvent
对象的通知。
分布式事务
与池化连接一样,通过实现与中间层基础设施配合使用的DataSource
对象创建的连接可能参与分布式事务。这使应用程序能够在单个事务中涉及多个服务器上的数据源。
用于分布式事务的类和接口包括:
XADataSource
XAConnection
XAConnection
接口派生自PooledConnection
接口,因此适用于池化连接的内容也适用于分布式事务中的连接。中间层的事务管理器会自动处理所有事务。应用程序代码的唯一更改是应用程序不能执行任何可能干扰事务管理器处理事务的操作。具体而言,应用程序不能调用Connection.commit
或Connection.rollback
方法,并且不能将连接设置为自动提交模式(即不能调用Connection.setAutoCommit(true)
)。
应用程序无需采取任何特殊措施即可参与分布式事务。它只需通过DataSource.getConnection
方法创建到要使用的数据源的连接,就像通常那样。事务管理器在幕后管理事务。XADataSource
接口创建XAConnection
对象,每个XAConnection
对象创建一个XAResource
对象,事务管理器使用该对象来管理连接。
Rowsets
RowSet
接口与幕后的各种其他类和接口一起工作。这些可以分为三类。
- 事件通知
RowSetListener
一个RowSet
对象是一个JavaBeans组件,因为它具有属性并参与JavaBeans事件通知机制。RowSetListener
接口由希望被通知特定RowSet
对象发生的事件的组件实现。这样的组件通过RowSet.addRowSetListener
方法向rowset注册自己作为监听器。当
RowSet
对象更改其行之一,更改其所有行或移动其光标时,它还会通知注册在其上的每个监听器。监听器通过执行其实现的通知方法来做出反应。RowSetEvent
作为其内部通知过程的一部分,RowSet
对象创建一个RowSetEvent
实例并将其传递给监听器。监听器可以使用这个RowSetEvent
对象来找出哪个rowset发生了事件。
- 元数据
RowSetMetaData
这个接口从ResultSetMetaData
接口派生,提供有关RowSet
对象中列的信息。应用程序可以使用RowSetMetaData
方法来找出rowset包含多少列以及每列可以包含什么类型的数据。RowSetMetaData
接口提供了设置列信息的方法,但应用程序通常不会使用这些方法。当应用程序调用RowSet
方法execute
时,RowSet
对象将包含一组新的行,并且其RowSetMetaData
对象将在内部更新以包含有关新列的信息。
- 读取器/写入器设施
实现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 教程与参考,第三版”
-
ClassDescription定义了在
DataSource
、XADataSource
和ConnectionPoolDataSource
之间共同的方法的接口。提供有关连接相关事件源的信息的Event
对象。注册以通知由PooledConnection
对象生成的事件的对象。PooledConnection
对象的工厂。用于连接到此DataSource
对象表示的物理数据源的连接工厂。提供连接池管理钩子的对象。从ConnectionPoolDataSource
对象创建的构建器,用于建立与data source
对象表示的数据库的连接。为 JDBC API 添加对 JavaBeans 组件模型的支持的接口。当发生事件影响到RowSet
对象时生成的Event
对象。RowSet
对象实现的接口,以便向RowSetReader
或RowSetWriter
对象展示自身。必须由希望在RowSet
对象的生命周期中发生重要事件时得到通知的组件实现的接口。包含RowSet
对象中列信息的对象。断开连接的RowSet
对象调用以填充自身数据行的设施。实现了RowSetWriter
接口的对象,称为 writer。发送给所有已在PooledConnection
注册的StatementEventListener
的StatementEvent
。注册以通知在语句池中的 PreparedStatements 上发生的事件的对象。提供分布式事务支持的对象。从XADataSource
对象创建的构建器,用于建立与data source
对象表示的数据库的连接。用于内部使用的XAConnection
对象的工厂。