Package 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
对象,连接池管理器将注册为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
事务管理器用于管理连接对象。
行集
RowSet
界面适用于幕后的各种其他类和接口。
这些可以分为三类。
- 事件通知
-
RowSetListener
一个RowSet
对象是一个JavaBeans的组件,因为它具有属性并参与到JavaBeans事件通知机制中。RowSetListener
接口由想要通知特定RowSet
对象发生的事件的组件实现。 这样一个组件通过RowSet.addRowSetListener
方法将其自身注册为具有行集的侦听器。当
RowSet
对象更改其行之一时,更改所有行,或移动其游标,它还会通知已注册的每个侦听器。 听众通过执行通知方法的实现来做出反应。 -
RowSetEvent
作为其内部的通知过程的一部分,一个RowSet
对象创建的实例RowSetEvent
并将其传递给听者。 监听器可以使用此RowSetEvent
对象来查找哪个行集具有事件。
-
- 元数据
-
RowSetMetaData
该接口从ResultSetMetaData
接口派生,提供有关RowSet
对象中的列的信息。 应用程序可以使用RowSetMetaData
方法来查找行RowSetMetaData
包含的列数以及每列可以包含什么样的数据。RowSetMetaData
界面提供了设置列的信息的方法,但应用程序通常不会使用这些方法。 当应用程序调用RowSet
方法execute
,RowSet
对象将包含一组新的行,其RowSetMetaData
对象将在内部更新,以包含有关新列的信息。
-
- 读者/作家设施
一个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
包中的类和接口的详细信息:
-
接口摘要 接口 描述 CommonDataSource 接口,定义它们之间的共同的方法DataSource
,XADataSource
和ConnectionPoolDataSource
。ConnectionEventListener 注册要通知由PooledConnection
对象生成的事件的对象。ConnectionPoolDataSource 一个PooledConnection
对象的工厂。DataSource 一个连接到DataSource
对象所代表的物理数据源的工厂。PooledConnection 提供连接池管理钩子的对象。PooledConnectionBuilder 从ConnectionPoolDataSource
对象创建的构建器,用于建立与data source
对象所表示的数据库的连接。RowSet 该接口为JavaBeans组件模型的JDBC API添加了支持。RowSetInternal 一个RowSet
对象实现的接口,以便向RowSetReader
或RowSetWriter
对象呈现自身。RowSetListener 一个接口,必须由一个组件实现,该组件希望在RowSet
对象的生命中发生重大事件时被通知。RowSetMetaData 一个对象,其中包含有关RowSet
对象中的列的信息。RowSetReader 断开连接的RowSet
对象调用的工具将自己填充数据行。RowSetWriter 一个实现RowSetWriter
接口的对象,称为 写入器 。StatementEventListener 注册在“声明”池中的PreparedStatements上发生的事件的通知对象。XAConnection 为分布式事务提供支持的对象。XAConnectionBuilder 从XADataSource
对象创建的构建器,用于建立与data source
对象所表示的数据库的连接。XADataSource 一个用于内部使用的XAConnection
对象的工厂。 -
类摘要 Class 描述 ConnectionEvent 一个Event
对象,提供有关连接相关事件源的信息。RowSetEvent 当事件发生到Event
对象时生成的一个RowSet
对象。StatementEvent AStatementEvent
发送到所有StatementEventListener
s,其中注册了一个PooledConnection
。