mysql

package
v0.0.16 Latest Latest
Warning

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

Go to latest
Published: Jun 28, 2026 License: MIT Imports: 10 Imported by: 0

README

mysql

简介

mysql 包提供了一个增强的 MySQL 数据库连接管理工具,基于 Go 标准库的 database/sqlgo-sql-driver/mysql 驱动。该包通过函数式选项模式提供灵活的配置,并支持连接池管理、错误日志记录和慢查询监控等功能。

主要特性
  • 基于标准库 database/sql 的 MySQL 连接管理
  • 支持连接池配置和优化
  • 内置错误日志记录功能
  • 支持慢查询监控和日志记录
  • 命名空间隔离的连接管理
  • 函数式选项的配置方式
  • 支持自定义日志记录器
  • 连接生命周期管理
设计理念

该包的设计遵循以下原则:

  1. 简单易用:提供简洁的 API,使数据库连接管理变得简单
  2. 灵活配置:通过函数式选项模式支持灵活的配置
  3. 性能优化:内置连接池管理,优化数据库连接性能
  4. 可观测性:支持错误日志和慢查询监控
  5. 安全性:支持命名空间隔离,避免连接混用

安装

前置条件
  • Go 版本要求:>= 1.18
  • 依赖要求:
    • github.com/go-sql-driver/mysql
    • github.com/fsyyft-go/kit/database/sql/driver
    • github.com/fsyyft-go/kit/log
安装命令
go get -u github.com/fsyyft-go/kit/database/sql/mysql

快速开始

基础用法
package main

import (
    "github.com/fsyyft-go/kit/database/sql/mysql"
)

func main() {
    // 创建数据库连接
    db, cleanup, err := mysql.NewMySQL(
        mysql.WithDSN("user:password@tcp(localhost:3306)/dbname"),
        mysql.WithPoolMaxOpenConns(100),
        mysql.WithPoolMaxIdleConns(10),
    )
    if err != nil {
        panic(err)
    }
    defer cleanup()

    // 使用数据库连接
    // db.Query()...
}
配置选项
// 完整配置示例
db, cleanup, err := mysql.NewMySQL(
    // 设置数据源名称
    mysql.WithDSN("user:password@tcp(localhost:3306)/dbname"),
    // 设置连接池参数
    mysql.WithPoolIdleTime(10 * time.Second),
    mysql.WithPoolMaxIdleTime(10 * time.Second),
    mysql.WithPoolMaxOpenConns(100),
    mysql.WithPoolMaxIdleConns(10),
    // 设置命名空间
    mysql.WithNamespace("app"),
    // 配置日志
    mysql.WithLogger(logger),
    mysql.WithLogError(true),
    // 设置慢查询监控
    mysql.WithSlowThreshold(200 * time.Millisecond),
)

详细指南

核心概念
  1. 连接池管理

    • 控制最大连接数
    • 管理空闲连接
    • 优化连接复用
  2. 日志记录

    • 错误日志记录
    • 慢查询监控
    • 自定义日志格式
  3. 命名空间

    • 隔离不同的数据库连接
    • 避免配置混淆
    • 支持多数据库管理
常见用例
1. 基本数据库连接
db, cleanup, err := mysql.NewMySQL(
    mysql.WithDSN("user:password@tcp(localhost:3306)/dbname"),
)
if err != nil {
    panic(err)
}
defer cleanup()
2. 配置连接池
db, cleanup, err := mysql.NewMySQL(
    mysql.WithDSN("user:password@tcp(localhost:3306)/dbname"),
    mysql.WithPoolMaxOpenConns(100),
    mysql.WithPoolMaxIdleConns(10),
    mysql.WithPoolIdleTime(10 * time.Second),
    mysql.WithPoolMaxIdleTime(10 * time.Second),
)
3. 启用错误日志和慢查询监控
logger, _ := kitlog.NewLogger()
db, cleanup, err := mysql.NewMySQL(
    mysql.WithDSN("user:password@tcp(localhost:3306)/dbname"),
    mysql.WithLogger(logger),
    mysql.WithLogError(true),
    mysql.WithSlowThreshold(200 * time.Millisecond),
)
最佳实践
  • 合理配置连接池参数

    • 根据应用负载设置最大连接数
    • 适当配置空闲连接数和超时时间
    • 避免连接资源浪费
  • 使用命名空间隔离连接

    • 为不同的业务模块使用不同的命名空间
    • 避免配置混淆
    • 便于问题定位
  • 配置监控和日志

    • 启用错误日志记录
    • 设置合适的慢查询阈值
    • 定期检查日志

API 文档

主要类型
MySQLOptions
type MySQLOptions struct {
    dns              string          // 数据源名称
    poolIdleTime     time.Duration  // 连接空闲超时时间
    poolMaxIdleTime  time.Duration  // 最大空闲时间
    poolMaxOpenConns int            // 最大打开连接数
    poolMaxIdleConns int            // 最大空闲连接数
    hook            *HookManager    // 钩子管理器
    namespace       string          // 命名空间
    logger          kitlog.Logger   // 日志记录器
    logError        bool           // 是否记录错误
    slowThreshold   time.Duration  // 慢查询阈值
}
关键函数
NewMySQL

创建新的 MySQL 数据库连接。

func NewMySQL(opts ...MySQLOption) (*sql.DB, func(), error)
配置选项函数
  • WithDSN:设置数据源名称
  • WithPoolIdleTime:设置连接空闲超时时间
  • WithPoolMaxIdleTime:设置最大空闲时间
  • WithPoolMaxOpenConns:设置最大打开连接数
  • WithPoolMaxIdleConns:设置最大空闲连接数
  • WithNamespace:设置命名空间
  • WithLogger:设置日志记录器
  • WithLogError:设置是否记录错误
  • WithSlowThreshold:设置慢查询阈值
默认值
defaultDSN = "test:test@tcp(localhost:3306)/test"
defaultPoolIdleTime = 10 * time.Second
defaultPoolMaxIdleTime = 10 * time.Second
defaultPoolMaxOpenConns = 100
defaultPoolMaxIdleConns = 10

性能指标

配置项 默认值 建议范围 说明
MaxOpenConns 100 50-500 根据服务器配置调整
MaxIdleConns 10 10-50 通常为 MaxOpenConns 的 10-20%
IdleTime 10s 10s-60s 根据业务峰值调整
MaxIdleTime 10s 10s-300s 避免空闲连接占用资源

调试指南

常见问题排查
1. 连接数过多

问题:数据库连接数持续增长 解决方案:

  • 检查 MaxOpenConns 设置
  • 确保正确调用 cleanup 函数
  • 检查是否有连接泄漏
2. 慢查询频繁

问题:出现大量慢查询日志 解决方案:

  • 调整 slowThreshold 阈值
  • 优化数据库索引
  • 检查 SQL 语句性能
3. 连接获取超时

问题:无法获取数据库连接 解决方案:

  • 增加 MaxOpenConns 值
  • 优化连接池配置
  • 检查数据库负载

相关文档

贡献指南

我们欢迎任何形式的贡献,包括但不限于:

  • 报告问题
  • 提交功能建议
  • 提交代码改进
  • 完善文档

请参考我们的贡献指南了解详细信息。

许可证

本项目采用 MIT 许可证。查看 LICENSE 文件了解更多信息。

Documentation

Overview

Package mysql 提供基于 go-sql-driver/mysql 的数据库连接构造器。

NewMySQL 会校验 DSN,为给定 namespace 注册带 Hook 的包装驱动,创建 *sql.DB 并配置连接池参数,然后返回数据库句柄和关闭用的 cleanup 函数。 同一 namespace 会复用已注册的驱动名称,便于在不同调用点共享同一组 driver 包 Hook 规则。

当启用 WithLogError 或 WithSlowThreshold 时,本包会按需安装错误日志或 慢查询日志 Hook;若未显式提供 logger,则会在需要时创建默认 logger。 NewMySQL 仅调用 sql.Open,不会主动 Ping 数据库,调用方需要在需要时 自行校验连通性。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func NewMySQL

func NewMySQL(opts ...MySQLOption) (*sql.DB, func(), error)

NewMySQL 基于 go-sql-driver/mysql 构造一个 *sql.DB 和清理函数。

NewMySQL 会先应用默认配置与传入选项,使用 ParseDSN 校验 DSN,然后以 "mysql-kit-<namespace>" 为名称按需注册带 Hook 的包装 driver,最后调用 sql.Open 创建 *sql.DB 并设置连接池参数。该函数只调用 sql.Open,不会主动 Ping 数据库,调用方需要在需要时自行验证连通性。

同一 namespace 的 driver 只会注册一次,后续调用会复用既有 driver 和其 初次注册时确定的 Hook 配置;新的 WithHookManager、WithLogError 和 WithSlowThreshold 不会重新装配已注册 driver。

参数:

  • opts: 按顺序应用的 MySQL 构造选项。

返回:

  • *sql.DB: 创建成功的数据库句柄,由调用方负责在不再使用时关闭。
  • func(): 清理函数,内部调用 db.Close;关闭失败时吞掉错误,并在 logger 非 nil 时记录错误;需要感知关闭错误的调用方应直接调用 db.Close。
  • error: DSN 校验失败、自动创建 logger 失败、sql.Open 失败,或驱动注册前 Hook 配置失败时返回错误。

Types

type MySQLOption

type MySQLOption func(*MySQLOptions)

MySQLOption 定义按引用修改 MySQLOptions 的函数式选项。

多个选项按传入顺序应用,后面的设置会覆盖前面的同类配置。

参数:

  • *MySQLOptions: 待修改的 MySQL 构造配置;调用方不应直接传入 nil。

func WithDSN

func WithDSN(dsn string) MySQLOption

WithDSN 设置传递给 NewMySQL 的原始 DSN。

DSN 会在 NewMySQL 中通过 go-sql-driver/mysql 的 ParseDSN 校验; 本选项本身不执行格式检查。

参数:

  • dsn: 数据库连接字符串,例如 "user:password@tcp(host:port)/dbname?param=value"。

返回:

  • MySQLOption: 设置 DSN 的配置函数。

func WithDSNParams

func WithDSNParams(baseDSN string, params map[string]string) MySQLOption

WithDSNParams 基于基础 DSN 追加一组查询参数。

baseDSN 为空时使用包内默认 DSN。params 中的值会按 URL 查询串规则编码; 当基础 DSN 已包含查询参数时继续使用 "&" 追加,否则使用 "?"。params 为空时保持基础 DSN 原样不变。

参数:

  • baseDSN: 基础 DSN;为空时使用包内默认 DSN。
  • params: 要追加的 DSN 查询参数;为空时不追加查询串。

返回:

  • MySQLOption: 设置 DSN 的配置函数。

func WithHookManager added in v0.0.10

func WithHookManager(hook *kitdriver.HookManager) MySQLOption

WithHookManager 指定一个自定义 HookManager 供驱动包装使用。

传入非 nil HookManager 后,NewMySQL 不会再为当前调用自动安装 HookLogError 或 HookLogSlow; 调用方需要自行向该管理器注册所需 Hook。传入 nil 等价于未指定。

参数:

  • hook: 用于包装 driver 的 HookManager;调用方应传入非 nil 实例。

返回:

  • MySQLOption: 设置 HookManager 的配置函数。

func WithLogError

func WithLogError(logError bool) MySQLOption

WithLogError 请求为自动创建的 HookManager 安装 HookLogError。

该选项只在 NewMySQL 首次为某个 namespace 注册 driver 且未显式提供 WithHookManager 时生效。

参数:

  • logError: 为 true 时启用错误日志 Hook;为 false 时不自动安装。

返回:

  • MySQLOption: 设置错误日志 Hook 开关的配置函数。

func WithLogger

func WithLogger(logger kitlog.Logger) MySQLOption

WithLogger 设置构造阶段和自动日志 Hook 使用的 logger。

该 logger 用于记录 DSN 校验失败、sql.Open 失败和 cleanup 关闭失败, 也会在自动安装 HookLogError 或 HookLogSlow 时复用。

参数:

  • logger: 用于输出日志的 kit logger;传入 nil 时仅在需要自动日志 Hook 时尝试创建默认 logger。

返回:

  • MySQLOption: 设置 logger 的配置函数。

func WithNamespace

func WithNamespace(namespace string) MySQLOption

WithNamespace 设置当前配置对应的 driver 注册命名空间。

NewMySQL 会使用 "mysql-kit-<namespace>" 作为 driver 名称;同一 namespace 的后续调用会复用已注册的 driver 与其初次注册时确定的 Hook 配置。

参数:

  • namespace: driver 注册命名空间;空字符串会生成 "mysql-kit-"。

返回:

  • MySQLOption: 设置命名空间的配置函数。

func WithPoolIdleTime

func WithPoolIdleTime(idleTime time.Duration) MySQLOption

WithPoolIdleTime 设置 NewMySQL 创建的 *sql.DB 的连接最大生命周期。

该选项最终映射到 (*sql.DB).SetConnMaxLifetime。非正值的含义沿用标准库 database/sql。

参数:

  • idleTime: 连接可被复用的最长时间。

返回:

  • MySQLOption: 设置连接最大生命周期的配置函数。

func WithPoolMaxIdleConns

func WithPoolMaxIdleConns(maxIdleConns int) MySQLOption

WithPoolMaxIdleConns 设置 NewMySQL 创建的 *sql.DB 的最大空闲连接数。

该选项最终映射到 (*sql.DB).SetMaxIdleConns。非正值与超过最大打开连接数时的行为沿用标准库 database/sql。

参数:

  • maxIdleConns: 连接池允许保留的最大空闲连接数。

返回:

  • MySQLOption: 设置最大空闲连接数的配置函数。

func WithPoolMaxIdleTime

func WithPoolMaxIdleTime(maxIdleTime time.Duration) MySQLOption

WithPoolMaxIdleTime 设置 NewMySQL 创建的 *sql.DB 的连接最大空闲时长。

该选项最终映射到 (*sql.DB).SetConnMaxIdleTime。非正值的含义沿用标准库 database/sql。

参数:

  • maxIdleTime: 空闲连接在连接池中保留的最长时间。

返回:

  • MySQLOption: 设置连接最大空闲时长的配置函数。

func WithPoolMaxOpenConns

func WithPoolMaxOpenConns(maxOpenConns int) MySQLOption

WithPoolMaxOpenConns 设置 NewMySQL 创建的 *sql.DB 的最大打开连接数。

该选项最终映射到 (*sql.DB).SetMaxOpenConns。非正值的含义沿用标准库 database/sql。

参数:

  • maxOpenConns: 连接池允许同时打开的最大连接数。

返回:

  • MySQLOption: 设置最大打开连接数的配置函数。

func WithSlowThreshold

func WithSlowThreshold(slowThreshold time.Duration) MySQLOption

WithSlowThreshold 设置自动慢操作日志 Hook 的耗时阈值。

该选项只在 NewMySQL 首次为某个 namespace 注册 driver 且未显式提供 WithHookManager 时生效;当操作耗时大于等于该阈值时会记录 Warn 日志。 非正值表示不自动安装慢操作日志 Hook。

参数:

  • slowThreshold: 慢操作耗时阈值。

返回:

  • MySQLOption: 设置慢操作阈值的配置函数。

type MySQLOptions

type MySQLOptions struct {
	// contains filtered or unexported fields
}

MySQLOptions 保存 NewMySQL 的构造参数。

MySQLOptions 通常通过 MySQLOption 函数组合填充,而不是由调用方直接操作 内部字段。NewMySQL 会先建立一份默认配置,再按传入顺序应用这些选项。

Jump to

Keyboard shortcuts

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