Appearance
MySQL JDBC 选项
1. 选项说明
1.1. serverTimezone
作用:指定 JDBC 客户端与 MySQL 服务器交互时使用的时区。MySQL 5.7+ 要求驱动端必须明确时区,否则可能报错;
默认值:驱动会尝试自动检测(通常是系统时区),如果检测不到会抛异常;
推荐值(生产):
- 建议显式指定,例如:
serverTimezone=UTC或serverTimezone=Asia/Shanghai; - 强烈建议应用和数据库保持统一时区(通常推荐
UTC),避免夏令时/跨时区问题。
- 建议显式指定,例如:
1.2. characterEncoding
作用:指定客户端连接使用的字符编码;
默认值:随 MySQL 驱动和服务器配置而定(通常是
UTF-8或latin1,新版本推荐UTF-8);推荐值(生产):
推荐不指定
characterEncoding(让 Connector/J 自动探测并使用服务器的utf8mb4),或设置为characterEncoding=UTF-8(注意是UTF-8,不是utf8mb4,characterEncoding期望的是 Java 平台的字符集名称,如UTF-8;utf8mb4是 MySQL 的字符集名称,不是 Java 标准名称)。
1.3. connectionCollation
作用:指定客户端连接使用的排序规则(Collation),即字符串比较与排序的方式;
它与 MySQL 服务端的
collation_connection参数对应,用于定义当客户端执行字符串比较、排序或LIKE匹配时所采用的规则。默认值:通常由服务器端的默认字符集与排序规则决定,例如:如果服务器的
character_set_server=utf8mb4,默认排序规则可能是utf8mb4_0900_ai_ci(MySQL 8.0);在 MySQL 5.7 中则可能是utf8mb4_general_ci。JDBC 驱动不会主动修改它,除非你显式指定。推荐值(生产):
保持与数据库的表定义及服务器默认排序规则一致是最佳实践。不一致可能导致字符串比较、索引使用或排序结果出现异常。
当数据库默认使用
utf8mb4字符集时,MySQL 5.7 及以下版本建议设置为utf8mb4_unicode_ci,MySQL 8.0 及以上版本建议设置为utf8mb4_0900_ai_ci。
1.4. connectTimeout
作用:建立连接的超时时间(毫秒);
默认值:
0(无限等待);推荐值(生产):
- 建议设置 2–10 秒,例如:
connectTimeout=5000; - 避免因网络或数据库不可用导致应用线程无限阻塞。
- 建议设置 2–10 秒,例如:
1.5. socketTimeout
作用:Socket 读操作的超时时间(毫秒)。如果超过该时间仍无响应,则抛出异常;
默认值:
0(无限等待);推荐值(生产):
- 建议设置 30–60 秒,例如:
socketTimeout=60000; - 可避免长时间阻塞在慢查询或网络异常上。
- 建议设置 30–60 秒,例如:
1.6. autoReconnect
作用:当连接断开时,驱动是否自动重连;
默认值:
false(在 MySQL Connector/J 8.0 中甚至已弃用);推荐值(生产):
- 不要启用(
autoReconnect=false); - 自动重连可能导致事务丢失、状态丢失;
- 生产中应使用连接池(HikariCP、Druid、C3P0)来管理连接。
- 不要启用(
1.7. useSSL
作用:是否通过 SSL 加密与 MySQL 通信;
默认值:
- MySQL 8.0 驱动默认
true(如果服务端支持 SSL); - 早期版本默认
false。
- MySQL 8.0 驱动默认
推荐值(生产):
- 内网环境可关闭:
useSSL=false,避免无证书警告; - 公网环境强烈建议启用 SSL,并配合
requireSSL=true、verifyServerCertificate=true使用。
- 内网环境可关闭:
1.8. allowPublicKeyRetrieval
作用:允许客户端在使用
caching_sha2_password(MySQL 8.0 默认认证方式)时,从服务器获取公钥;默认值:
false;推荐值(生产):
- 内网/测试环境常配合
allowPublicKeyRetrieval=true&useSSL=false使用; - 生产环境中更安全的做法是:在客户端配置服务端公钥文件,而不是依赖
allowPublicKeyRetrieval。
- 内网/测试环境常配合
1.9. zeroDateTimeBehavior
作用:处理 MySQL
0000-00-00或0000-00-00 00:00:00这种 “零日期” 的行为;可选值:
exception(默认):抛异常;convertToNull:转为NULL;round:转换为最小有效日期0001-01-01。
推荐值(生产):
- 建议
convertToNull,避免异常中断; - 最好从业务和数据建模层面禁止零日期。
- 建议
1.10. allowMultiQueries
作用:是否允许一次执行多条 SQL(用
;分隔);默认值:
false;推荐值(生产):
- 保持默认值
false,以防止 SQL 注入攻击; - 只有在确实需要(如批量 DDL、存储过程调用时)才开启。
- 保持默认值
1.11. rewriteBatchedStatements
当使用 JDBC 的 PreparedStatement.addBatch() 方法批量添加多条 SQL 语句(如批量插入、更新),再通过 executeBatch() 执行时,默认情况下,驱动会将批量操作拆分成多条独立的 SQL 语句,逐条发送到 MySQL 服务器执行。
启用该参数后,MySQL JDBC 驱动会对批量操作的 SQL 语句进行重写优化,将多条相同结构的 SQL 合并为一条批量 SQL 语句,减少网络交互次数,从而大幅提升性能。
举例:
未启用时:多条独立语句
SQLINSERT INTO t (id) VALUES (1); INSERT INTO t (id) VALUES (2); INSERT INTO t (id) VALUES (3);启用后:合并为单条批量语句
SQLINSERT INTO t (id) VALUES (1), (2), (3);
对于 UPDATE 或 DELETE 等批量操作,驱动也会进行类似的合并优化(如通过 IN 条件合并)。
2. 常用配置示例
Properties
jdbc:mysql://host:3306/dbname?
serverTimezone=UTC&
characterEncoding=UTF-8&
connectionCollation=utf8mb4_0900_ai_ci&
connectTimeout=5000&
socketTimeout=60000&
useSSL=false&
allowPublicKeyRetrieval=true&
zeroDateTimeBehavior=convertToNull&
allowMultiQueries=true&
rewriteBatchedStatements=true1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
警告
allowPublicKeyRetrieval=true 仅在没有配置客户端公钥文件时使用,若可行最好禁用。