CockroachDB 默认强制 TLS 加密,pgx 连接需用 postgresql://root@127.0.0.1:26257/defaultdb?sslmode=verify-full&sslrootcert=/path/to/ca.crt;开发可临时用 sslmode=disable;推荐 pgxpool 而非 pgx.Conn 以复用连接、适配分布式负载;遇 TransactionRetryWithProtoRefreshError 需手动重试事务。

pgx 连接 CockroachDB 时 URL 格式怎么写
CockroachDB 兼容 PostgreSQL 协议,pgx 能直接连,但默认不启用 TLS 会报错——不是驱动不支持,是 CockroachDB 默认强制加密通信。
正确连接字符串长这样:postgresql://root@127.0.0.1:26257/defaultdb?sslmode=verify-full&sslrootcert=/path/to/ca.crt
-
sslmode=verify-full是必须的(CockroachDB v22.2+ 强制),不能用disable或require -
sslrootcert指向你启动集群时生成的ca.crt,通常在certs/目录下 - 如果用
cockroach start --insecure启动(仅开发),可改用sslmode=disable,但pgx会警告并要求显式设置PGSSLMODE=disable - 用户名必须存在,
root是默认内置账号;首次连接前建议先用cockroach sql手动创建业务用户
pgxpool 与 pgx.Conn 哪个更适合 CockroachDB
选 pgxpool。CockroachDB 是分布式系统,连接池能复用 TCP 连接、避免频繁握手开销,也天然适配其负载均衡机制。
用法示例:
立即学习“go语言免费学习笔记(深入)”;
pool, err := pgxpool.Connect(context.Background(), connString)
if err != nil {
log.Fatal(err)
}
defer pool.Close()
-
pgx.Conn是单次连接,适合短生命周期操作(如 CLI 工具初始化),但每次都要建连+TLS 握手,在高并发下明显拖慢 -
pgxpool自动管理空闲连接、健康检查,配合 CockroachDB 的重试语义(如RETRY错误)更稳定 - 注意调大
max_conns:CockroachDB 默认单节点最大连接数是 500,但实际建议按业务 QPS 和事务耗时设为 20–100,避免打满 coordinator 节点
执行 SQL 时遇到 “pq: restart transaction: TransactionRetryWithProtoRefreshError” 怎么办
这不是连接问题,是 CockroachDB 的乐观并发控制触发了事务重试——pgx 不会自动重试,得你自己加逻辑。
- 错误信息里含
TransactionRetryWithProtoRefreshError就是典型重试信号,不是网络或权限问题 - 不要用
panic或直接返回错误,应捕获该错误并循环重试(最多 3–5 次) - 重试时必须新建事务(
pool.BeginTx),不能复用旧tx对象 - 简单模式:把整个业务逻辑包进
for i := 0; i ,每次进 <code>defer tx.Rollback(ctx),成功则tx.Commit()并 break
为什么用 pgx 而不是 database/sql + pq
pgx 原生解析 PostgreSQL 协议,绕过 database/sql 抽象层,对 CockroachDB 的扩展类型(如 INTERVAL、JSONB、分布式序列)支持更准,性能也高 15–30%。
-
pq已归档,不再维护;pgx主动适配 CockroachDB 新版协议特性(比如 v23.1 的ALTER TABLE ... SPLIT AT返回元数据) -
pgx支持pgtype自定义类型映射,处理DECIMAL(CockroachDB 默认数值类型)时不会意外转成 float64 丢精度 - 调试时
pgx的日志字段更全(例如能打出重试次数、协调节点 ID),排查分布式事务卡点更直接











