feat(db): 添加数据库配置自动查找和缓存功能
- 实现配置文件自动查找功能,支持yaml、yml、toml、ini、json格式 - 添加查询缓存机制,提高重复查询性能 - 新增构建脚本build.sh和build.bat用于跨平台编译 - 添加完整的数据库连接配置和时间字段配置功能 - 实现DAO基类提供通用CRUD操作方法 - 添加配置文件示例和相关测试用例
This commit is contained in:
@@ -0,0 +1,153 @@
|
||||
package driver
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"database/sql/driver"
|
||||
"errors"
|
||||
"sync"
|
||||
)
|
||||
|
||||
// IDriverManager 驱动管理器接口 - 统一管理所有数据库驱动的注册和使用
|
||||
type IDriverManager interface {
|
||||
// 注册驱动
|
||||
Register(name string, d driver.Driver) error // 注册一个新的数据库驱动
|
||||
// 获取驱动
|
||||
GetDriver(name string) (driver.Driver, error) // 根据名称获取已注册的驱动
|
||||
// 列出所有驱动
|
||||
ListDrivers() []string // 列出所有已注册的驱动名称
|
||||
// 打开数据库连接
|
||||
Open(driverName, dataSource string) (*sql.DB, error) // 使用指定驱动打开数据库连接
|
||||
}
|
||||
|
||||
// DriverManager 驱动管理器实现 - 管理所有数据库驱动的生命周期
|
||||
type DriverManager struct {
|
||||
mu sync.RWMutex // 读写锁,保证并发安全
|
||||
drivers map[string]driver.Driver // 存储所有已注册的驱动
|
||||
sqlDBs map[string]*sql.DB // 存储已创建的数据库连接池
|
||||
}
|
||||
|
||||
var defaultManager *DriverManager // 默认驱动管理器实例
|
||||
var once sync.Once // 单例模式同步控制
|
||||
|
||||
// GetDefaultManager 获取默认驱动管理器 - 使用单例模式确保全局唯一实例
|
||||
func GetDefaultManager() *DriverManager {
|
||||
once.Do(func() {
|
||||
defaultManager = &DriverManager{
|
||||
drivers: make(map[string]driver.Driver), // 初始化驱动映射表
|
||||
sqlDBs: make(map[string]*sql.DB), // 初始化连接池映射表
|
||||
}
|
||||
// 注册所有内置驱动
|
||||
defaultManager.registerBuiltinDrivers()
|
||||
})
|
||||
return defaultManager
|
||||
}
|
||||
|
||||
// registerBuiltinDrivers 注册所有内置驱动 - 自动注册框架自带的所有数据库驱动
|
||||
func (dm *DriverManager) registerBuiltinDrivers() {
|
||||
// TODO: 注册 MySQL 驱动
|
||||
// dm.Register("mysql", &MySQLDriver{})
|
||||
|
||||
// TODO: 注册 SQLite 驱动
|
||||
// dm.Register("sqlite", &SQLiteDriver{})
|
||||
|
||||
// TODO: 注册 PostgreSQL 驱动
|
||||
// dm.Register("postgres", &PostgresDriver{})
|
||||
|
||||
// TODO: 注册 SQL Server 驱动
|
||||
// dm.Register("sqlserver", &SQLServerDriver{})
|
||||
|
||||
// TODO: 注册 Oracle 驱动
|
||||
// dm.Register("oracle", &OracleDriver{})
|
||||
|
||||
// TODO: 注册 ClickHouse 驱动
|
||||
// dm.Register("clickhouse", &ClickHouseDriver{})
|
||||
}
|
||||
|
||||
// Register 注册驱动 - 将新的数据库驱动注册到管理器中
|
||||
func (dm *DriverManager) Register(name string, d driver.Driver) error {
|
||||
dm.mu.Lock()
|
||||
defer dm.mu.Unlock()
|
||||
|
||||
if _, exists := dm.drivers[name]; exists {
|
||||
return nil // 已存在,不重复注册
|
||||
}
|
||||
|
||||
dm.drivers[name] = d
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetDriver 获取驱动 - 根据驱动名称查找并返回已注册的驱动
|
||||
func (dm *DriverManager) GetDriver(name string) (driver.Driver, error) {
|
||||
dm.mu.RLock()
|
||||
defer dm.mu.RUnlock()
|
||||
|
||||
d, exists := dm.drivers[name]
|
||||
if !exists {
|
||||
return nil, ErrDriverNotFound // 驱动未找到错误
|
||||
}
|
||||
|
||||
return d, nil
|
||||
}
|
||||
|
||||
// ListDrivers 列出所有驱动 - 返回所有已注册的驱动名称列表
|
||||
func (dm *DriverManager) ListDrivers() []string {
|
||||
dm.mu.RLock()
|
||||
defer dm.mu.RUnlock()
|
||||
|
||||
names := make([]string, 0, len(dm.drivers))
|
||||
for name := range dm.drivers {
|
||||
names = append(names, name)
|
||||
}
|
||||
return names
|
||||
}
|
||||
|
||||
// Open 打开数据库连接 - 使用指定驱动和数据源创建数据库连接池
|
||||
func (dm *DriverManager) Open(driverName, dataSource string) (*sql.DB, error) {
|
||||
dm.mu.Lock()
|
||||
defer dm.mu.Unlock()
|
||||
|
||||
// 检查是否已有连接(避免重复创建)
|
||||
key := driverName + ":" + dataSource
|
||||
if db, exists := dm.sqlDBs[key]; exists {
|
||||
return db, nil
|
||||
}
|
||||
|
||||
// 获取驱动
|
||||
d, err := dm.GetDriver(driverName)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 创建连接器(需要驱动实现 Connector 接口)
|
||||
connector, ok := d.(driver.Connector)
|
||||
if !ok {
|
||||
return nil, ErrDriverNotConnector // 驱动不支持 Connector 接口
|
||||
}
|
||||
|
||||
// 创建 sql.DB 连接池
|
||||
db := sql.OpenDB(connector)
|
||||
dm.sqlDBs[key] = db
|
||||
|
||||
return db, nil
|
||||
}
|
||||
|
||||
// Close 关闭指定连接 - 释放特定数据源的数据库连接池
|
||||
func (dm *DriverManager) Close(driverName, dataSource string) error {
|
||||
dm.mu.Lock()
|
||||
defer dm.mu.Unlock()
|
||||
|
||||
key := driverName + ":" + dataSource
|
||||
if db, exists := dm.sqlDBs[key]; exists {
|
||||
if err := db.Close(); err != nil {
|
||||
return err
|
||||
}
|
||||
delete(dm.sqlDBs, key)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// 错误定义 - 定义驱动管理器相关的错误类型
|
||||
var (
|
||||
ErrDriverNotFound = errors.New("driver not found") // 驱动未找到错误
|
||||
ErrDriverNotConnector = errors.New("driver does not implement Connector interface") // 驱动不支持 Connector 接口错误
|
||||
)
|
||||
@@ -0,0 +1,30 @@
|
||||
package driver
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"database/sql/driver"
|
||||
|
||||
sqlite3 "github.com/mattn/go-sqlite3"
|
||||
)
|
||||
|
||||
// SQLiteDriver SQLite 数据库驱动实现
|
||||
type SQLiteDriver struct {
|
||||
nativeDriver driver.Driver
|
||||
}
|
||||
|
||||
// NewSQLiteDriver 创建 SQLite 驱动实例
|
||||
func NewSQLiteDriver() *SQLiteDriver {
|
||||
return &SQLiteDriver{
|
||||
nativeDriver: &sqlite3.SQLiteDriver{},
|
||||
}
|
||||
}
|
||||
|
||||
// Open 打开数据库连接
|
||||
func (d *SQLiteDriver) Open(name string) (driver.Conn, error) {
|
||||
return d.nativeDriver.Open(name)
|
||||
}
|
||||
|
||||
// OpenDB 打开数据库连接(使用 sql.DB)
|
||||
func (d *SQLiteDriver) OpenDB(dataSourceName string) (*sql.DB, error) {
|
||||
return sql.Open("sqlite3", dataSourceName)
|
||||
}
|
||||
Reference in New Issue
Block a user