DataSource
引言
用Spring进行Web应用开发时,我们经常会做datasource的配置。而且datasource的配法风格各异。那么他们到底有哪些异同点呢?
DataSource作用
DataSource是javax.sql包中的类,是Java原生rt.jar包中的类。
1 | public interface DataSource extends CommonDataSource, Wrapper { |
javax.sql.DataSource定义的是抽象方法,通过Java JNDI的方式将具体实现开放给各个厂商、组织自己、个人自己实现。
在Spring框架中,通过DataSource + 配置的方式,来定义具体的数据库源。并向Spring框架提供数据源的Connection服务。
在Spring中若想实现多数据源,那么就需要在DataSource下手。
javax.sql.DataSource源码注释说明
1 | /** |
概要翻译
- Part - 1:
- DataSource是获取物理数据源连接的工厂类。
- 作为DriverManager工具的替代方案,DataSource对象是获取连接的首选方法.
- DataSource的实现类一般都通过JNDI的方式注册到框架中进行使用。
- Part - 2:
- DataSource一般由数据库厂商提供对应的实现类,DataSource有三种实现方式
- 基本实现,生成标准连接对象。
- 连接池实现,适用于中间层连接池管理器。
- 分布式事务实现。此实现适用于中间层事务管理器,并且几乎总是使用连接池管理器。
- DataSource一般由数据库厂商提供对应的实现类,DataSource有三种实现方式
Part - 3:
- DataSource向Spring框架屏蔽了具体数据源的差异,即当物理数据源切换时,只需要更新相关的DataSource配置值即可,不需要应用层修改代码。
Part - 4:
- 数据库Driver都是通过DataSource对象被注册到DriverManager中,而不是由Driver直接向DriverManager注册。
- 但是对于获取Connection,先通过检索先获得DataSource,再根据DataSource对象进行getConnection,而不是直接从DriverManager获取Connection。
Spring-JDBC的DataSource实现案例
在 Spring-jdbc 下,DataSource 最顶级的类是 AbstractDataSource ,对 DataSource 的所有父接口方法做了实现。但保留 getConnection() 方法由子类实现。
在 AbstractDriverBasedDataSource 中,定义了大量的参数,诸如 url, username 等,这些都被用来定位并定义与数据库实例的连接。
1 | package org.springframework.jdbc.datasource; |
整合方案为将除 url 外的所有参数整合在同一个 Properties 对象中 (其中,Properties 可以被认为是一个线程安全的 Hash Map) 。最终调用 Connection getConnectionFromDriver(Properties props) 获取连接。
AbstractDriverBasedDataSource 抽象类的两个子类 DriverManagerDataSource 和 SimpleDriverDataSource 都以不同方式获得了连接(Connection),但总结而言,获取连接(Connection) 的任务被委托给了 Driver 来实现。
1 | // ---------------------------- |