1. DataSource基础概念与核心作用
DataSource作为Java数据库连接的核心抽象,其设计理念体现了Java"面向接口编程"的思想精髓。不同于传统的DriverManager方式,DataSource提供了更灵活、更可控的数据库连接管理机制。
1.1 接口定义与设计哲学
javax.sql.DataSource接口仅定义了两个核心方法:
java复制public interface DataSource extends CommonDataSource, Wrapper {
Connection getConnection() throws SQLException;
Connection getConnection(String username, String password) throws SQLException;
}
这种极简设计背后的考量是:
- 实现解耦:将接口定义与具体实现分离,允许不同厂商提供自己的实现方案
- 扩展性:通过Wrapper接口支持实现类的功能扩展
- 配置灵活性:连接参数可通过外部配置注入,而非硬编码在应用中
提示:DataSource接口位于javax.sql包而非java.sql包,这种设计有意将"标准接口"与"扩展实现"分离,体现了Java标准库的分层设计思想。
1.2 三种实现类型解析
根据官方文档,DataSource实现分为三类:
| 类型 | 特点 | 适用场景 | 代表实现 |
|---|---|---|---|
| 基本实现 | 每次创建新连接 | 简单应用、测试环境 | DriverManagerDataSource |
| 连接池实现 | 复用连接对象 | 生产环境高并发 | HikariCP、DBCP |
| 分布式事务实现 | 支持XA协议 | 分布式系统 | Atomikos、Bitronix |
连接池实现的工作原理:
- 初始化时创建若干连接放入池中
- 请求连接时从池中取出空闲连接
- 使用完毕后归还连接而非直接关闭
- 通过maxActive、minIdle等参数控制池大小
1.3 与传统DriverManager的对比
java复制// DriverManager方式(传统)
Connection conn = DriverManager.getConnection(url, user, password);
// DataSource方式(现代)
DataSource ds = // 初始化数据源
Connection conn = ds.getConnection();
关键差异点:
- 注册机制:DriverManager需要显式Class.forName()注册驱动,DataSource自动管理
- 配置方式:DriverManager参数硬编码,DataSource支持外部化配置
- 扩展能力:DataSource支持连接池、分布式事务等高
