JDBC连接池最佳实践
JDBC通过URL建立与数据库的会话,URL中的连接参数直接决定连接的字符集、加密、超时等行为。连接池(Druid、HikariCP等)在JDBC之上复用连接,URL参数对池中每条物理连接同样生效。本文以MySQL协议(mysql-connector-j 8.0)为例,各参数默认值与说明依据 Connector/J 官方文档。
标准 JDBC URL
URL格式为 jdbc:mysql://<host>:<port>/<database>?key1=value1&key2=value2,?之前指定协议、主机、端口和数据库,?之后为连接参数,以 key=value 键值对形式提供,多个参数用 & 分隔。
标准示例如下(换行仅为便于阅读,实际配置写为一行):
jdbc:mysql://<host>:3306/<database>
?connectTimeout=10000
&socketTimeout=60000
&tcpKeepAlive=true
&autoReconnect=false | 参数 | 默认值 | 含义 | 建议值 | 说明 |
|---|---|---|---|---|
| connectTimeout | 0 | 建立套接字连接的超时(毫秒) | 10000 | 主备倒换或网络不通时,避免应用线程长时间阻塞在connect阶段。仅作用于建连阶段,连接建立后不再生效。 |
| socketTimeout | 0 | 套接字读取超时(毫秒) | 60000 | 单次读操作在此时间内无数据返回即中断连接。 主备倒换、锁等待、页面获取阻塞等导致连接挂起时主动断开,避免线程无限等待;须大于业务最长查询耗时,否则误杀正常长查询。 |
| tcpKeepAlive | true | 是否启用TCP层探活机制 | true | 操作系统层面保活并探测对端是否存活,建议保持true。 |
| autoReconnect | false | 连接失效后是否自动重连 | false | 官方不推荐设为true,重连不可靠,会丢失会话状态、临时表、事务和用户变量。 |
connectTimeout 与socketTimeout 建议同时配置,分别覆盖建连与读取两个阶段。任一参数为0意味着对应阶段无超时保护,生产环境不建议保持默认值0。
“建议值”为生产常见取值,需结合业务最长查询耗时等调整。
其他常用连接参数
以下为字符集、加密、时区与性能类的常用参数,按需配置。重要性较低或未列出的参数请直接参考官网。
| 参数 | 默认值 | 含义 | 建议值 | 说明 |
|---|---|---|---|---|
| sslMode | PREFERRED | SSL/TLS 加密模式 | PREFERRED / REQUIRED | 默认 PREFERRED(服务端支持则加密,否则明文);生产环境建议设为REQUIRED强制加密,需确保服务端已启用TLS 且证书受信。 |
| useUnicode | true | 是否以Unicode方式处理字符传输 | true | 建议保持true,配合characterEncoding使用。 |
| characterEncoding | 与数据库字符集保持一致 | 连接使用的字符集 | 与数据库字符集一致(如utf8mb4) | 建议与数据库字符集一致。 |
| serverTimezone | 与数据库时区保持一致 | 连接会话时区 | 数据库所在时区(如Asia/Shanghai) | 建议设为数据库所在时区,避免时间偏差或时区报错。 |