clickhouse-go v2.x 中所有可配置选项。若需查看包含代码示例的指南,请参阅配置。
版本标注在
clickhouse-go v2.35.0 及更高版本中新增的选项,会在其说明旁标注 (自 vX.Y.Z 起)。没有 “Since” 标记的选项自 v2.0 起即已可用,并包含在所有受支持的版本中。选项的设置方式
当多个作用范围重叠时,范围越具体,优先级越高:批次 > 查询 > 连接。对于
Settings,查询级别的键会与连接级别的键合并;如果发生冲突,则以查询级别为准。
通过 Options 结构体:
database/sql) :
连接选项
协议和连接
身份验证
超时
已空闲的 ClickHouse Cloud 服务会被暂停,并在收到第一个传入连接时唤醒。唤醒通常需要几十秒,在此期间拨号会阻塞。如果
DialTimeout 低于唤醒时间,则空闲一段时间后的第一次查询会因拨号超时而失败,而不是正常执行。对于可能是第一个访问已休眠服务的 client,请将 DialTimeout 设为 1m–2m。代价是在真实故障期间检测失败会更慢——拨号会一直阻塞到完整超时时间后才报错——因此更建议只对首次连接应用较高的超时,或在单个查询上使用 Context deadline 来限制端到端耗时。连接池
仅适用于 database/sql
ConnMaxIdleTime 是 Go 标准 database/sql 连接池设置。它不在 clickhouse.Options struct 中,也不能通过 clickhouse.Open() 设置。请在 OpenDB() 之后设置:标准 database/sql 连接池设置
clickhouse.OpenDB() 或 sql.Open("clickhouse", dsn) 时,返回的 *sql.DB 支持 Go 的标准连接池方法。OpenDB() 会自动应用 Options 中的前三项:
ClickHouse API (clickhouse.Open)
clickhouse.Open() 返回的连接不支持这些方法。ClickHouse API 会直接使用 Options 结构体中的字段,在内部管理自己的连接池。压缩
按协议划分的压缩方法支持情况:
TLS
代码示例请参见 TLS。
日志
缓冲区与内存
HTTP 专用
双层 HTTP 连接池使用 HTTP 时,存在两个连接池:
- 第 1 层 (应用层) :
MaxIdleConns/MaxOpenConns— 控制httpConnect对象 - 第 2 层 (传输层) :
HttpMaxConnsPerHost— 控制底层 TCP 连接
HttpMaxConnsPerHost。高级连接
客户端信息
ClickHouse 服务器设置
常见设置:
Context 级别查询选项
clickhouse.Context() 为每个查询单独设置:
Context 截止时间的行为如果 Context 的截止时间 > 1 秒,
max_execution_time 会自动设为 seconds_remaining + 5。这会覆盖任何手动设置的值。批次选项
PrepareBatch()。导入:github.com/ClickHouse/clickhouse-go/v2/lib/driver。
速查表
连接池大小建议
超时建议
DSN 参数速查
故障排查
连接池耗尽:“acquire conn timeout”
MaxOpenConns 连接都在使用中,且在 DialTimeout 期限内没有连接可用。
解决方法
请按顺序尝试以下步骤,并在调整参数前先排查根本原因:
- 检查是否有长时间运行并占用连接的查询:
SELECT query_id, elapsed FROM system.processes ORDER BY elapsed DESC。如果有,先处理这些慢查询。 - 如果你运行的是长生命周期的批次 (从
PrepareBatch()到Send()之间相隔数分钟或数小时) ,请使用WithReleaseConnection(),以便在批次保持打开期间将连接归还到连接池。 - 增加
MaxOpenConns,使其与实际观测到的并发度相匹配。 - 仅当预期会出现突发流量,且等待获取连接确实是瓶颈时,才增加
DialTimeout。
读取超时和连接重置错误
ReadTimeout,或者连接被服务器/网络关闭。
解决方法:
- 对长时间运行的查询增大
ReadTimeout - 使用 Context deadline 控制每个查询的超时时间
- 检查 ClickHouse 服务端的
max_execution_time限制
”Code: 516. 身份验证失败”
- 对照
system.users表核实凭据 - 检查 DSN 密码中的特殊字符是否存在 URL 编码问题
- 确认该用户有权访问指定数据库
TLS 证书错误
内存逐渐增长
- 在内存受限的环境中设置
FreeBufOnConnRelease: true - 减少
MaxIdleConns以限制空闲连接数 - 如果使用压缩,减小
MaxCompressionBuffer - 调低
ConnMaxLifetime,让连接更频繁地轮换