Java 中 DataSource-数据源 的基础介绍
一、核心概念解析1.1 数据源(Data Source)1.2 数据库连接池(Connection Pool)1.3 二者关系1.4 DataSource 接口
二、DataSource 解决的问题与优势2.1 DataSource 的作用2.2 传统方式的局限性2.3 使用连接池 DataSource 的改进
三、Spring Boot 中 DataSource 的配置与使用3.1 自动配置3.2 自定义配置
一、核心概念解析
1.1 数据源(Data Source)
数据源是一个抽象概念,代表数据的来源和访问方式。它封装了数据库连接所需的配置信息(如 URL、用户名、密码),并提供获取数据库连接的接口。从本质上讲,数据源是一种数据访问抽象,它屏蔽了底层数据存储的细节,使应用程序能够以统一的方式访问不同类型的数据库。
1.2 数据库连接池(Connection Pool)
数据库连接池是一种管理数据库连接的技术,属于数据源的一种具体实现方式。它通过预先创建一定数量的连接并维护在池中,当应用程序需要连接时直接从池中获取,使用完毕后归还而非关闭,从而避免频繁创建和销毁连接带来的性能开销。
1.3 二者关系
数据源是一个更宽泛的概念,而连接池是数据源的一种高效实现方式。可以将它们的关系理解为: 数据源(抽象概念) ⊇ 连接池(具体实现)
从技术角度看:
非连接池数据源:每次请求都创建新连接(如传统的 DriverManager 方式)连接池数据源:复用现有连接,提高性能(如 HikariCP、DBCP)
1.4 DataSource 接口
javax.sql.DataSource是 Java 提供的数据源标准接口,它定义了获取数据库连接的方法(getConnection())。该接口既可以由连接池实现(如 HikariDataSource),也可以由非连接池实现(如简单的 DriverManagerDataSource)。
public interface DataSource extends CommonDataSource, Wrapper {
Connection getConnection() throws SQLException;
Connection getConnection(String username, String password)
throws SQLException;
}
二、DataSource 解决的问题与优势
2.1 DataSource 的作用
统一连接获取方式:通过getConnection()方法提供标准接口,使代码不依赖具体实现支持多种实现策略:既可以使用连接池提高性能,也可以使用简单实现进行测试配置与代码解耦:数据库配置信息(URL、用户名等)可外部化配置,便于维护资源管理与监控:连接池实现支持连接状态监控、自动回收空闲连接等高级特性容器集成:与应用服务器(如 Tomcat)或框架(如 Spring)深度集成,提供 JNDI 等高级特性
2.2 传统方式的局限性
对JDBC知识点记忆模糊的同学可以参考这篇文章温故一下:【JDBC 核心执行流程详解】 代码示例(不使用 DataSource):
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class TraditionalConnectionExample {
public static void main(String[] args) {
try (Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mydb",
"root",
"password")) {
// 执行SQL操作
} catch (SQLException e) {
e.printStackTrace();
}
}
}
问题分析:
性能瓶颈:每次请求都创建新连接,高并发下开销大资源浪费:未复用连接,可能导致数据库连接数超限配置分散:连接参数硬编码在代码中,难以统一管理错误处理复杂:需手动管理连接关闭,易造成资源泄漏
2.3 使用连接池 DataSource 的改进
代码示例(使用 HikariCP 连接池):
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DataSourceExample {
private static final DataSource dataSource;
static {
// 配置连接池
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
config.setUsername("root");
config.setPassword("password");
config.setMaximumPoolSize(10); // 最大连接数
config.setMinimumIdle(5); // 最小空闲连接数
dataSource = new HikariDataSource(config);
}
public static void main(String[] args) {
try (Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users")) {
while (rs.next()) {
System.out.println("User: " + rs.getString("username"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
优势分析:
连接复用:连接从池中获取,使用后归还,避免重复创建性能提升:测试显示,高并发下响应时间降低约 70%配置集中化:所有连接参数统一在配置类中管理自动资源回收:连接池自动管理连接生命周期,减少泄漏风险
三、Spring Boot 中 DataSource 的配置与使用
3.1 自动配置
Spring Boot 默认使用 HikariCP 作为数据源,只需在application.properties中添加以下配置:
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
3.2 自定义配置
如需自定义连接池参数,可创建配置类:
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class DataSourceConfig {
@Bean
public DataSource dataSource() {
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
ds.setUsername("root");
ds.setPassword("password");
ds.setMaximumPoolSize(15);
ds.setIdleTimeout(30000);
return ds;
}
}