Documentation
¶
Overview ¶
Package clickhousex 提供基于 GORM 的 ClickHouse 连接池、显式主从选择和统一查询日志。
创建入口只接收 Config,客户端由应用通过 Close 或 CloseAll 显式关闭。 InitTimeout 为全部主从端点共用的初始化超时,默认 10 秒;实际操作仍由请求 context 控制。 应用启动时创建客户端,查询时传入请求 context;以下示例需导入 github.com/ClickHouse/clickhouse-go/v2 和 github.com/bpcoder16/pixiu/infra/clickhousex:
client, err := clickhousex.New(clickhousex.Config{
Name: "analytics",
LogSQL: true,
Master: clickhousex.Endpoint{
Host: "clickhouse.example.com",
Port: 9000,
Database: "analytics",
Username: dbUser,
Password: dbPassword,
Settings: clickhouse.Settings{
"session_timezone": "UTC",
},
},
})
if err != nil {
return err
}
defer client.Close() // 应用退出时在 logit.Close 前调用
return client.SlaveDB(ctx).Where("user_id = ?", id).Find(&events).Error
session_timezone 控制服务端查询使用的会话时区;多个端点需分别配置。 时间列需要固定时区时,应在表结构中声明 DateTime('UTC') 或 DateTime64(3, 'UTC')。 会话设置不保证 Go 返回值的 time.Time.Location 为 UTC。 ClickHouse 没有 MySQL 式的连接字符集配置;文本建议使用 UTF-8。 Go 驱动默认使用服务端或列声明的时区解码时间值。
多个逻辑库可用 NewNamed 按 Config.Name 创建并登记;Named 按名称取得共享客户端。 使用 lifecycle 统一管理资源时,由应用先登记日志关闭函数,再登记 CloseAll; 名称不存在或 CloseAll 开始后调用 Named 会 panic,需在启动时确认名称并先停止任务。 以下示例还需导入 errors、github.com/bpcoder16/pixiu/lifecycle 和 github.com/bpcoder16/pixiu/logit,logger 与 cfg 已由调用方创建:
var stack lifecycle.Stack
if err := stack.Register(func() error {
return logit.Close(logger)
}); err != nil {
return err
}
if err := stack.Register(clickhousex.CloseAll); err != nil {
return errors.Join(err, stack.Close())
}
if _, err := clickhousex.NewNamed(cfg); err != nil {
return errors.Join(err, stack.Close())
}
client := clickhousex.Named(cfg.Name)
_ = client
// 停止使用命名客户端的任务后,统一关闭连接池,最后关闭日志。
return stack.Close()
从库可接受延迟的查询使用 SlaveDB;写入及要求最新数据的查询使用 MasterDB。 Create 依赖默认事务的 Commit 发送批次,不要设置 SkipDefaultTransaction=true。 提交错误由 Create.Error 返回;此机制不提供 MySQL 式的多语句回滚保证。 GORM 的 Info、Warn、Error 诊断消息按对应级别记录;慢查询和错误总会记录 SQL, InterpolateSQL 默认关闭,以保留占位符。ctx 已调用 logit.WithStart 时,每次 GORM Trace 以 ClickHouse_<Name> 为前缀自动编号登记下游耗时,供 logit.InfoDuration 汇总。
单个逻辑下游可显式初始化默认客户端,省去每次按名称查询。cfg 已由应用构造:
if _, err := clickhousex.NewDefault(cfg); err != nil {
return err
}
return clickhousex.Default().SlaveDB(ctx).Find(&events).Error
启动阶段由调用方串行调用 NewNamed 和 NewDefault,不并发初始化。 Name 仍必填;Default() 与 Named(cfg.Name) 返回同一实例,New 和 NewNamed 不自动设置默认实例。重复默认初始化报错;失败可重试。未初始化或 CloseAll 开始后调用 Default 会 panic。应用停止查询后调用 CloseAll,默认与命名实例 统一关闭一次,日志最后关闭;默认实例不要单独登记 Close。
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
Types ¶
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
Client 持有一个主库和零个或多个从库的 GORM 连接池。
func Default ¶
func Default() *Client
Default 返回显式初始化的默认客户端,与 Named(cfg.Name) 是同一实例。 未初始化或 CloseAll 开始后调用会 panic;New 和 NewNamed 不设置默认实例。
func NewDefault ¶
NewDefault 创建默认客户端,同时按 Config.Name 登记;已有默认实例时返回错误。 Name 仍必填;创建失败可重试,初始化与关闭约束与 NewNamed 相同。
func NewNamed ¶
NewNamed 创建并按 Config.Name 登记客户端。名称重复时不替换已有实例。 启动阶段由调用方串行创建;初始化完成后可并发查询。 初始化完成后不得再调用,所有创建返回后才开始查询,关闭须在初始化之后执行。
type Config ¶
type Config struct {
// InitTimeout 限制全部端点连接、验活和版本探测的总耗时;零值默认 10 秒,负值无效。
InitTimeout time.Duration
// Name 是必填的逻辑库名,用作日志中的下游标识。
Name string
// Master 是必填的主库连接配置,MasterDB 使用它。
Master Endpoint
// Slaves 是可选的从库配置;SlaveDB 轮询选择,未配置时回退主库。
Slaves []Endpoint
// SlowThreshold 零值为 200 毫秒,严格超过时记录 Warn。
SlowThreshold time.Duration
// LogSQL 控制正常查询的 Info SQL 日志;错误和慢查询始终记录 SQL。
LogSQL bool
// InterpolateSQL 开启后会在诊断 SQL 中展开参数,可能记录业务数据。
InterpolateSQL bool
}
Config 配置一个逻辑 ClickHouse 数据库及其日志行为。
type Endpoint ¶
type Endpoint struct {
// Host 是必填的主机名或 IP 地址,不包含端口。
Host string
// Port 是服务端端口,零值时原生协议使用 9000,HTTP 使用 8123;TLS 端口应显式设置。
Port int
// Database 是必填的数据库名。
Database string
// Username 是必填的数据库用户名。
Username string
// Password 是连接密码,可以为空;调用方不要将其写入日志。
Password string
// Protocol 零值为原生 TCP,也可设置为 clickhouse.HTTP。
Protocol clickhouse.Protocol
// TLS 非 nil 时启用 TLS,调用方应配置证书验证所需的参数。
TLS *tls.Config
// DialTimeout 是建立连接的超时,零值沿用驱动默认值。
DialTimeout time.Duration
// ReadTimeout 是读取数据的超时,零值沿用驱动默认值。
ReadTimeout time.Duration
// Settings 透传至官方驱动;创建客户端后不得修改。
Settings clickhouse.Settings
// Compression 指定驱动压缩选项;创建客户端后不得修改。
Compression *clickhouse.Compression
// Pool 是此端点的连接池配置,零值使用 Pool 的默认值。
Pool Pool
}
Endpoint 表示一个 ClickHouse 主库或从库的连接配置。
type Pool ¶
type Pool = gormcore.PoolConfig
Pool 配置单个端点的连接池。零值分别采用 100、min(10, MaxOpenConns)、 3 分钟和 1 分钟;负值无效,空闲数不能超过打开数。