数据源配置
基本配置
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: MyPoolPHP 中不需要关心连接池,因为 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=值2PHP 的 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。