clickhousex

package
v0.1.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 4, 2026 License: Apache-2.0 Imports: 17 Imported by: 0

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

func CloseAll

func CloseAll() error

CloseAll 关闭全部已登记的命名及默认客户端,每个实例只关闭一次。 重复调用返回同一次关闭结果。 应用应先停止使用客户端的任务,再调用 CloseAll。

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 Named

func Named(name string) *Client

Named 返回已登记的命名客户端;名称不存在或关闭开始后调用会 panic。

func New

func New(cfg Config) (client *Client, err error)

New 创建并验活全部端点;全部端点共用 InitTimeout 预算,失败时关闭已创建的连接池。 客户端由调用方通过 Close 显式关闭,查询时再传入操作 context。

func NewDefault

func NewDefault(cfg Config) (*Client, error)

NewDefault 创建默认客户端,同时按 Config.Name 登记;已有默认实例时返回错误。 Name 仍必填;创建失败可重试,初始化与关闭约束与 NewNamed 相同。

func NewNamed

func NewNamed(cfg Config) (*Client, error)

NewNamed 创建并按 Config.Name 登记客户端。名称重复时不替换已有实例。 启动阶段由调用方串行创建;初始化完成后可并发查询。 初始化完成后不得再调用,所有创建返回后才开始查询,关闭须在初始化之后执行。

func (*Client) Close

func (c *Client) Close() error

Close 关闭所有连接池;重复调用返回首次关闭结果。

func (*Client) MasterDB

func (c *Client) MasterDB(ctx context.Context) *gorm.DB

MasterDB 返回绑定 ctx 的主库会话。

func (*Client) SlaveDB

func (c *Client) SlaveDB(ctx context.Context) *gorm.DB

SlaveDB 返回绑定 ctx 的从库会话;未配置从库时使用主库。

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 分钟;负值无效,空闲数不能超过打开数。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL