补充 java.sql 包,提供 Java 服务器端数据源访问和处理的 API。
javax.sql 包提供了以下内容:
- DataSource 接口,DriverManager 的替代品,用于与数据源建立连接
- 连接池和语句池
- 分布式事务
- Rowsets
应用程序可直接使用的 API 是 DataSource 和 RowSet。连接池和分布式事务 API 由中间层基础架构在内部使用。
1 DataSource
DataSource 主要目的是替换 DriverManager。
1.1 替换原因
- 可以使用连接池、语句池和分布式事务。
- 可以对数据源的属性进行更改,不需要更改应用程序代码
- 缓存 PreparedStatement 以便更快的执行
- 可以设置连接超时时间
1.2 三种实现
- 基本实现:生成标准 Connection 对象,与通过 DriverManager 设施获取的连接相同
- 连接池实现:生成自动创建连接池的 Connection 对象。与中间层连接池管理器一起工作
- 分布式事务实现:生成用于分布式事务的 Connection 对象,几乎总是参与到连接池中。该实现与中间层事务管理器一起工作
通过 DataSource 对象访问的驱动程序不会向 DriverManager 注册。
2 连接池和语句池
连接池由中间层自动完成。应用程序只是简单地使用 DataSource.getConnection 方法来获取池连接,并以与使用任何 Connection 对象相同的方式使用它。
实现原理:连接池使用集合来进行装载,返回的 Connection 是原始 Connection 的代理,代理 Connection 的 close 方法,当调用 close 方法时,不是真正关连接,而是把它代理的 Connection 对象放回到连接池中,等待下一次重复利用。
3 分布式事务
用于分布式事务的类和接口是:
- XADataSource
- XAConnection
这些 XA 接口的实现,需要数据库的 JDBC 提供,MySQL 没有。
不需任何特殊操作,只需像通常那样通过 DataSource.getConnection 获取连接,由事务管理器在幕后管理事务。
XADataSource 接口创建 XAConnection 对象,每个 XAConnection 对象都会创建事务管理器用来管理连接的 XAResource 对象。
一旦 XAConnection 参与事物,则不能手动干扰事务管理器。 如,不能调用 Connection.commit 或 Connection.rollback 方法,无法将连接设置为自动提交模式。
4 Rowsets
RowSet 继承自 ResultSet,和 ResultSet 相比,它更具灵活性。可离线,可更新的。
4.1 RowSet 特性
- 使用了 JavaBean 的事件驱动模型,它可以给注册的组件发送事件通知,比如游标的移动,行的增删改,以及 RowSet 内容的修改等。
- 提供了 Java Bean 的功能,可以通过 settter 和 getter 方法来设置和获取属性。
4.2 RowSet 分类
1)连接型 RowSet
- JdbcRowSet:与数据库进行连接,和 ResultSet 很类似。
2)离线型 RowSet
不需要和数据库进行连接,更轻量级,更易序列化。适用于在网络间传递数据。
- CachedRowSet:可获取连接,执行查询并读取 ResultSet 的数据到 RowSet 里。可以在离线时对数据进行维护和更新,然后重新连接到数据库里,并回写改动的数据。
- WebRowSet:继承自 CachedRowSet,可以读写 XML 文档。
- JoinRowSet:继承自 WebRowSet,可不连数据库执行 join
- FilteredRowSet:继承自 WebRowSet,可过滤数据