3. 数据库选型与版本:MySQL/PostgreSQL 版本选择、兼容性要求、驱动配置
在 Testing 环境中,数据库选型直接影响回归冒烟的执行效率与结果可靠性。本章节聚焦 MySQL 与 PostgreSQL 的版本选择原则、兼容性约束以及驱动配置规范,确保测试环境与生产环境在语义层面保持一致,同时避免因版本差异导致的冒烟误报。
3.1 版本选择原则
Testing 环境应优先选用与生产环境大版本一致的数据库发行版。若生产环境使用 MySQL 8.0,Testing 环境不得降级至 MySQL 5.7,否则可能因 SQL 语法、索引优化器或字符集行为差异导致冒烟通过但生产失败。
| 数据库 | 推荐 Testing 版本 | 生产版本参考 | 关键兼容性风险 |
|---|---|---|---|
| MySQL | 8.0.28+ / 8.4 LTS | 8.0.x / 8.4.x | utf8mb4 默认排序规则、窗口函数支持、CTE 递归限制 |
| PostgreSQL | 15.x / 16.x | 15.x / 16.x | 分区表语法、JSONB 操作符、逻辑复制槽行为 |
版本锁定策略: 在 docker-compose.yml 或 Helm values 中显式指定数据库镜像的完整版本标签(如
mysql:8.0.36),避免使用 latest 标签。每次生产版本升级后,Testing 环境应在 1 个工作日内同步大版本。
3.2 兼容性要求矩阵
回归冒烟场景中,数据库兼容性需覆盖以下四个维度:
- SQL 方言兼容:避免使用 MySQL 专有语法(如
GROUP_CONCAT默认排序)在 PostgreSQL 上执行。 - 数据类型映射:确保
JSON、ARRAY、ENUM等类型在驱动层正确转换。 - 事务隔离级别:Testing 环境默认使用
READ COMMITTED,与生产保持一致。 - 字符集与排序规则:统一使用
utf8mb4(MySQL)或UTF8(PostgreSQL)。
3.3 驱动配置规范
驱动版本必须与数据库大版本匹配,且优先使用官方维护的 JDBC / ODBC / Python 驱动。以下为 Testing 环境常用驱动配置清单:
| 语言/框架 | 数据库 | 推荐驱动 | 版本约束 |
|---|---|---|---|
| Java (Spring Boot) | MySQL | mysql-connector-j | ≥ 8.0.33,兼容 MySQL 8.0/8.4 |
| Java (Spring Boot) | PostgreSQL | postgresql (org.postgresql) | ≥ 42.6.0,支持 PG 15/16 |
| Python (Django) | MySQL | mysqlclient / pymysql | mysqlclient ≥ 2.2.0 |
| Python (Django) | PostgreSQL | psycopg2 / psycopg3 | psycopg2 ≥ 2.9.9 |
| Go | MySQL | go-sql-driver/mysql | ≥ 1.7.1 |
| Go | PostgreSQL | pgx / lib/pq | pgx ≥ 5.5.0 |
驱动配置示例(Spring Boot application-testing.yml):
spring:
datasource:
url: jdbc:mysql://testing-db:3306/regression_db?useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=utf8mb4
username: test_user
password: ${DB_PASSWORD}
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
maximum-pool-size: 10
minimum-idle: 2
connection-timeout: 5000
3.4 连接参数与 SSL 配置
Testing 环境通常关闭 SSL 以降低延迟,但需在连接字符串中显式声明。以下为关键连接参数对比:
| 参数 | MySQL 示例 | PostgreSQL 示例 | 说明 |
|---|---|---|---|
| SSL 模式 | useSSL=false |
sslmode=disable |
Testing 环境禁用,生产强制启用 |
| 字符集 | characterEncoding=utf8mb4 |
client_encoding=UTF8 |
避免中文乱码 |
| 时区 | serverTimezone=UTC |
TimeZone=UTC |
统一使用 UTC,避免夏令时问题 |
| 连接超时 | connectTimeout=5000 |
connectTimeout=5 |
单位:毫秒(MySQL)/ 秒(PG) |
常见陷阱: PostgreSQL 的
connectTimeout 单位是秒,而 MySQL 是毫秒。在配置连接池时务必区分单位,否则可能导致冒烟脚本因超时设置过短而误判为数据库不可用。
3.5 多数据库并行测试策略
当回归冒烟需要同时覆盖 MySQL 与 PostgreSQL 时,建议采用数据源路由模式,而非硬编码切换连接。以下为推荐的架构示意:
3.6 版本兼容性自检清单
在每次冒烟执行前,建议运行以下自检脚本,确保数据库环境符合预期:
-- MySQL 版本与字符集检查
SELECT VERSION() AS db_version,
@@character_set_database AS charset,
@@collation_database AS collation;
-- PostgreSQL 版本与编码检查
SELECT version() AS db_version,
pg_encoding_to_char(encoding) AS encoding,
datcollate AS collation
FROM pg_database
WHERE datname = current_database();
自动化建议: 将版本自检集成到冒烟前置脚本中,若检测到版本不匹配则直接中止执行并输出告警。可使用
assert 或 exit code 1 阻断流水线,避免在错误环境中浪费计算资源。