Skip to content

数据源配置


基本配置

yaml
# application.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/my_app?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: secret
    driver-class-name: com.mysql.cj.jdbc.Driver
    # ⬆ PHP 开发注意:JDBC 驱动类名是固定的,不同数据库不同
    # MySQL 8+: com.mysql.cj.jdbc.Driver
    # PostgreSQL: org.postgresql.Driver
    # H2(开发/测试用): org.h2.Driver

对应的 PHP 配置:

php
// .env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=my_app
DB_USERNAME=root
DB_PASSWORD=secret

HikariCP 连接池

Spring Boot 默认使用 HikariCP 作为连接池(业界性能最好的 Java 连接池,没有之一)。

yaml
spring:
  datasource:
    hikari:
      maximum-pool-size: 20       # 最大连接数(类比 PHP-FPM 的 pm.max_children)
      minimum-idle: 5             # 最小空闲连接数
      connection-timeout: 30000   # 获取连接超时(毫秒)
      idle-timeout: 600000        # 空闲超时(毫秒)
      max-lifetime: 1800000       # 连接最大存活时间(毫秒)
      pool-name: MyPool

PHP 中不需要关心连接池,因为 PHP-FPM 每个进程处理完请求就销毁所有资源,连接无法复用。PHP 的连接池需要在应用层面额外实现(如 Swoole)。

Java 应用长期运行,连接池是强制需要的,HikariCP 开箱即用。


多数据源

yaml
spring:
  datasource:
    primary:                          # 主库(读写)
      url: jdbc:mysql://master:3306/my_app
      username: root
      password: secret
    secondary:                        # 从库(只读)
      url: jdbc:mysql://slave:3306/my_app
      username: readonly
      password: readonly

配置类:

java
@Configuration
public class DataSourceConfig {

    @Primary
    @Bean(name = "primaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }
}

PHP 中读写分离通常靠 Laravel 的 DB::connection('mysql::read') 自动切换,Java 中需要显式配置多个 DataSource Bean。


⚠️ 常见坑

1. 忘记配 driver-class-name

大多数情况下 Spring Boot 能从 JDBC URL 自动推断驱动类(mysql:// → com.mysql.cj.jdbc.Driver),但不是 100% 可靠。建议显式配置。

2. 时区问题

java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized.

MySQL 连接 URL 必须加 serverTimezone=Asia/Shanghai,否则报时区错误。

3. JDBC URL 格式

jdbc:mysql://host:port/database?参数1=值1&参数2=值2

PHP 的 PDO 连接串格式类似但不同:mysql:host=127.0.0.1;port=3306;dbname=my_app

4. 需要手动添加 MySQL 驱动依赖

xml
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

Spring Boot 不内置 MySQL 驱动,需要自己加。不加的话启动不报错,但访问数据库时报 ClassNotFoundException。

面向 PHP 开发者的 Spring Boot 文档