This commit is contained in:
JACKYMYPERSON
2025-11-04 23:00:01 +08:00
parent 334752373e
commit 76b863b99d
10 changed files with 12 additions and 57 deletions

View File

@@ -8,50 +8,42 @@ import (
"sync"
"time"
_ "modernc.org/sqlite" // 纯 Go 驱动,驱动名是 "sqlite" 而非 "sqlite3"
_ "modernc.org/sqlite"
)
var (
GlobalDB *sql.DB
once sync.Once // 确保 InitCache 只执行一次(单例初始化)
once sync.Once
)
// InitCache 初始化 SQLite 数据库连接(全局唯一,兼容 CGO_ENABLED=0
func InitCache() {
once.Do(func() {
// 1. 数据库文件路径(自定义为你的用户数据库路径)
dbPath := "./database/local/user.db"
// 2. 创建数据库目录(确保上级目录存在,不存在则自动创建)
if err := os.MkdirAll(filepath.Dir(dbPath), 0755); err != nil {
panic(fmt.Sprintf("创建数据库目录失败:%v", err))
}
// 3. 打开 SQLite 连接:驱动名必须是 "sqlite"(对应 modernc.org/sqlite
db, err := sql.Open("sqlite", dbPath)
if err != nil {
panic(fmt.Sprintf("打开 SQLite 数据库失败:%v", err))
}
// 4. 验证连接有效性(必做,避免连接创建成功但不可用)
if err := db.Ping(); err != nil {
_ = db.Close() // 连接失败时释放资源
_ = db.Close()
panic(fmt.Sprintf("验证 SQLite 连接失败:%v", err))
}
// 5. 连接池配置(适配 SQLite 单文件特性)
db.SetMaxOpenConns(1) // 最大打开连接数=1避免文件锁冲突
db.SetMaxIdleConns(1) // 最大空闲连接数=1与最大打开数一致
db.SetConnMaxLifetime(0) // 连接生命周期无限制
db.SetConnMaxIdleTime(30 * time.Minute) // 空闲连接30分钟超时释放
db.SetMaxOpenConns(1)
db.SetMaxIdleConns(1)
db.SetConnMaxLifetime(0)
db.SetConnMaxIdleTime(30 * time.Minute)
// 6. 赋值全局变量,初始化完成
GlobalDB = db
fmt.Printf("SQLite 数据库初始化成功,文件路径:%s\n", dbPath)
})
}
// GetCacheDB 获取全局唯一的 SQLite 连接(必须先调用 InitCache 初始化)
func GetCacheDB() *sql.DB {
if GlobalDB == nil {
panic("数据库未初始化,请先调用 cache.InitCache()")
@@ -59,7 +51,6 @@ func GetCacheDB() *sql.DB {
return GlobalDB
}
// CloseCache 关闭数据库连接(程序退出时调用,释放资源)
func CloseCache() error {
if GlobalDB != nil {
return GlobalDB.Close()