BGORM是一个基于GORM的Golang数据库管理库,专为需要管理多个数据库连接的应用程序设计。它提供了数据库连接池的管理、惰性连接(懒加载)以及线程安全的数据库操作支持。
- 支持多种数据库:MySQL、PostgreSQL、SQLite、SQL Server
- 惰性连接创建(仅在首次使用时创建连接)
- 线程安全的连接管理
- 支持连接池参数配置
- 简洁的API接口
- 高并发下的稳定性保证
- 支持动态配置更新
BGORM适用于多种需要管理多个数据库连接的应用场景,以下是几个典型应用示例:
在电商系统中,通常需要处理不同类型的数据库:
- 主数据库:存储订单、用户、商品等核心业务数据
- 日志数据库:存储系统日志、用户行为等数据
- 库存数据库:用于高频的库存操作,可能需要独立优化
BGORM允许您在应用程序中轻松管理这些不同的数据库连接,并在订单处理、库存管理、用户操作等各个业务流程中无缝切换使用不同的数据库。
对于SaaS应用,每个租户可能有独立的数据库:
- 根据租户ID动态创建和管理数据库连接
- 实现租户间数据隔离,提高安全性
- 支持租户特定的数据库配置和优化
BGORM的惰性连接创建特性使其非常适合多租户场景,只有在实际需要使用时才会创建数据库连接,有效节约系统资源。
在高并发系统中实现读写分离:
- 主库:处理所有的写操作(INSERT、UPDATE、DELETE)
- 从库:处理只读操作(SELECT),可以有多个从库分担读负载
BGORM让您可以轻松地在代码中区分读写操作,将它们分别路由到主库和从库,从而提升系统整体性能和可扩展性。
在微服务架构中,每个服务可能需要连接到不同的数据库:
- 用户服务:连接用户数据库
- 订单服务:连接订单数据库
- 产品服务:连接产品数据库(可能使用不同类型的数据库,如PostgreSQL)
BGORM支持在同一应用内管理多种不同类型的数据库连接,非常适合微服务架构中需要访问不同数据源的场景。
go get github.com/qq1060656096/bgormpackage main
import (
"fmt"
"github.com/qq1060656096/bgorm"
"log"
)
func main() {
// 创建配置
config := &bgorm.Config{
DSN: "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True",
DriverType: bgorm.DriverTypeMysql,
}
// 注册数据库配置
err := bgorm.DefaultDBManager().Register("main", config)
if err != nil {
log.Fatal(err)
}
// 获取数据库连接
db, err := bgorm.DefaultDBManager().GetDB("main")
if err != nil {
log.Fatal(err)
}
// 使用GORM进行数据库操作
// db.Create(...), db.Find(...), etc.
// 程序结束时关闭所有连接
defer bgorm.DefaultDBManager().CloseAll()
}maxIdleConns := 10
maxOpenConns := 100
maxLifetime := 3600 // 秒
config := &bgorm.Config{
DSN: "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True",
DriverType: bgorm.DriverTypeMysql,
MaxIdleConns: &maxIdleConns,
MaxOpenConns: &maxOpenConns,
MaxLifetime: &maxLifetime,
}BGORM 提供了灵活的 DSN(数据源名称)配置选项,使您能够轻松构建不同数据库类型的连接字符串。
// 创建 MySQL DSN 选项
option := &bgorm.DSNOption{
DriverType: bgorm.DriverTypeMysql,
Host: "127.0.0.1",
Port: 3306,
User: "user",
Password: "password",
DBName: "dbname",
Params: map[string]string{
"charset": "utf8mb4",
"parseTime": "True",
},
}
// 获取构建的 DSN 字符串
dsnString := option.String()
// 结果: "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True"
// 在配置中使用
config := &bgorm.Config{
DSN: dsnString,
DriverType: bgorm.DriverTypeMysql,
}BGORM 也支持使用函数式选项模式来构建 DSN:
// 使用 NewDSN 函数和选项构建 MySQL DSN
dsnString := bgorm.NewDSN(
bgorm.DriverTypeMysql,
bgorm.WithHost("127.0.0.1"),
bgorm.WithPort(3306),
bgorm.WithUserPassword("user", "password"),
bgorm.WithDBName("dbname"),
bgorm.WithParams(map[string]string{
"charset": "utf8mb4",
"parseTime": "True",
"loc": "Local",
}),
)
// 在配置中使用
config := &bgorm.Config{
DSN: dsnString,
DriverType: bgorm.DriverTypeMysql,
}MySQL DSN 支持多种参数配置,以下是常用参数:
| 参数名 | 说明 | 示例值 |
|---|---|---|
| charset | 字符集 | utf8mb4 |
| parseTime | 是否解析时间 | True |
| loc | 时区设置 | Local, UTC, Asia/Shanghai |
| timeout | 连接超时时间(秒) | 10s |
| readTimeout | 读取超时时间 | 30s |
| writeTimeout | 写入超时时间 | 30s |
| collation | 字符序 | utf8mb4_general_ci |
| multiStatements | 是否允许多语句 | true |
示例:
params := map[string]string{
"charset": "utf8mb4",
"parseTime": "True",
"loc": "Asia/Shanghai",
"timeout": "10s",
"readTimeout": "30s",
"writeTimeout": "30s",
"collation": "utf8mb4_general_ci",
"multiStatements": "true",
}
dsnString := bgorm.NewDSN(
bgorm.DriverTypeMysql,
bgorm.WithHost("127.0.0.1"),
bgorm.WithPort(3306),
bgorm.WithUserPassword("user", "password"),
bgorm.WithDBName("dbname"),
bgorm.WithParams(params),
)// 注册主数据库
mainConfig := &bgorm.Config{
DSN: "user:password@tcp(127.0.0.1:3306)/main_db?charset=utf8mb4",
DriverType: bgorm.DriverTypeMysql,
}
bgorm.DefaultDBManager().Register("main", mainConfig)
// 注册分析数据库
analyticsConfig := &bgorm.Config{
DSN: "host=localhost port=5432 user=postgres dbname=analytics",
DriverType: bgorm.DriverTypePostgres,
}
bgorm.DefaultDBManager().Register("analytics", analyticsConfig)
// 根据需要获取不同的数据库连接
mainDB, _ := bgorm.DefaultDBManager().GetDB("main")
analyticsDB, _ := bgorm.DefaultDBManager().GetDB("analytics")// 创建新的数据库管理器
manager := bgorm.NewDBManager()
// 获取默认的数据库管理器
manager := bgorm.DefaultDBManager()// Register 注册一个数据库配置
// 注册后首次使用时才会创建数据库连接
err := manager.Register(name string, config *Config) error// GetDB 获取指定名称的数据库连接
// 如果连接不存在但配置存在,则创建新连接
db, err := manager.GetDB(name string) (*gorm.DB, error)// Close 关闭指定的数据库连接
err := manager.Close(name string) error
// CloseAll 关闭所有数据库连接
err := manager.CloseAll() error// HasDB 检查是否存在指定名称的数据库配置
exists := manager.HasDB(name string) bool
// GetDBNames 获取所有已注册的数据库名称
names := manager.GetDBNames() []string
// Unregister 注销指定名称的数据库配置
err := manager.Unregister(name string) error
// IsConnected 检查数据库是否已连接
connected := manager.IsConnected(name string) bool// StartPeriodicWriteConfig 启动周期性写入配置的定时器
// 参数说明:
// - m: 数据库管理器实例
// - d: 定时器触发的时间间隔
// - fn: 返回配置数组的函数,每次定时器触发时执行
// 返回一个停止函数,调用该函数可以停止定时器
stopFunc := bgorm.StartPeriodicWriteConfig(m *DBManager, d time.Duration, fn func() []*Config) func()示例:
// 创建数据库管理器
manager := bgorm.DefaultDBManager()
// 定义配置生成函数
configGenerator := func() []*bgorm.Config {
// 从配置中心、文件或其他来源获取最新配置
return []*bgorm.Config{
{
DSN: "user:pass@tcp(127.0.0.1:3306)/db1?charset=utf8mb4",
DriverType: bgorm.DriverTypeMysql,
},
{
DSN: "user:pass@tcp(127.0.0.1:3306)/db2?charset=utf8mb4",
DriverType: bgorm.DriverTypeMysql,
},
}
}
// 启动周期性配置更新(每60秒更新一次)
stopFunc := bgorm.StartPeriodicWriteConfig(manager, 60*time.Second, configGenerator)
// 在程序结束时停止定时器
defer stopFunc()type Config struct {
DSN string // 数据库连接字符串
DriverType string // 数据库驱动类型 (mysql, sqlite, postgres, sqlserver)
MaxIdleConns *int // 最大空闲连接数
MaxOpenConns *int // 最大打开连接数
MaxLifetime *int // 连接最大生命周期(秒)
}可用的驱动类型常量:
bgorm.DriverTypeMysql- MySQL数据库bgorm.DriverTypeSqlite- SQLite数据库bgorm.DriverTypePostgres- PostgreSQL数据库bgorm.DriverTypeSqlServer- SQL Server数据库
go test -count=1 -v .
go test -count=1 -race .MIT