goland连接cockroachdb需显式配置ssl:本地--insecure时url加?sslmode=disable;启用tls时须指定sslrootcert绝对路径并设sslmode=verify-full;推荐使用postgresql-42.6.x.jar驱动并启用postgresql原生内省。

GoLand 能连 CockroachDB,但默认配置会失败——它把 CockroachDB 当成标准 PostgreSQL,而 CockroachDB 启动时(哪怕是 cockroach start --insecure)也强制要求 TLS 握手,GoLand 的 JDBC 驱动默认走 sslmode=require,结果连不上,报错类似 FATAL: SSL is required 或直接 connection refused。
连接字符串必须显式禁用 SSL 检查(仅限本地开发)
本地用 cockroach start --insecure 时,CockroachDB 不提供证书,也不接受加密连接,但 GoLand 仍会尝试 SSL 握手。不改连接参数,100% 连不上。
- 在 GoLand 的数据源配置里,把 JDBC URL 改成:
postgresql://root@localhost:26257/defaultdb?sslmode=disable - 不要只填
localhost:26257然后指望 GoLand 自动补全——它不会加?sslmode=disable - 如果用了非默认端口(比如
--port=26258),URL 中的端口号必须同步更新 - 用户名填
root即可(--insecure模式下无密码);若启用了认证,需额外配密码字段
生产环境要配 CA 证书,不能关 SSL
集群启用 TLS(如用 cockroach cert 生成证书)后,sslmode=disable 不再合法,GoLand 会拒绝连接或报 certificate signed by unknown authority。
- JDBC URL 必须包含
sslrootcert=/path/to/ca.crt和sslmode=verify-full -
/path/to/ca.crt是你生成的ca.crt文件的**绝对路径**,且 GoLand 进程必须有读取权限 - GoLand 不支持相对路径或 classpath 引用,写
./certs/ca.crt会静默失败 - 驱动版本建议用最新版
postgresql-42.6.x.jar或更高,旧版对sslmode=verify-full支持不稳定
选对驱动和内省设置,否则表都看不到
GoLand 默认推荐的 PostgreSQL 驱动能连上,但可能无法正确识别 CockroachDB 的系统表、序列、主键策略,导致代码补全、SQL 注入检查、DDL 生成等功能异常。
- 在“数据源和驱动程序”对话框中,手动下载并指定官方推荐的 JDBC 驱动:
postgresql-42.6.0.jar(不是旧版 42.2.x) - 连接成功后,在数据源属性 → “选项” → “高级” 中勾选
Use PostgreSQL native introspection(启用原生内省) - 取消勾选
Use database-specific introspection,避免 GoLand 尝试调用 CockroachDB 不支持的 pg_catalog 查询 - 如果仍看不到表,右键数据源 → “刷新” 或按
Ctrl+Alt+Y,强制重载 schema
连接池和超时设置影响稳定性
GoLand 的数据库工具窗口本身不走连接池,但如果你在项目里用 pgxpool 写了后端代码,而 GoLand 连接配置和代码里的连接串不一致(比如一个关 SSL、一个没关),调试时容易误判是代码问题。
- 确保 GoLand 数据源的 URL 和 Go 代码中
pgxpool.Connect()用的字符串完全一致——包括末尾参数顺序 - 在 GoLand 数据源的“高级”设置里,把
Connection timeout (sec)设为10,避免卡死在不可达地址 - 不要勾选
Keep connection alive并设极短心跳间隔,CockroachDB 对空闲连接清理较激进,心跳失败反而干扰调试 - 如果连接后频繁断开,检查 GoLand 日志(Help → Show Log in Explorer),重点搜
PSQLException和SSL
最常被忽略的是:GoLand 连上了 ≠ 你的 Go 服务能连上。它只是个客户端,不验证你代码里写的连接逻辑是否匹配集群实际配置。本地 --insecure 和生产 TLS 的 URL 差一个参数,就足以让服务启动失败,而且错误堆栈里往往不提 SSL,只报“dial tcp refused”。











