package client import ( "Blog/bootstrap" "os" "sync" "github.com/glebarez/sqlite" "github.com/sirupsen/logrus" "gorm.io/gorm" ) var fileGorm *DB var blogGorm *DB var gormInitMutex *sync.Mutex = &sync.Mutex{} type DB struct { *gorm.DB Mutex *sync.RWMutex } // sqlite无法同时多个线程写入,需要上锁保护,读操作无需考虑 func (db *DB) WGorm(txFunc func(tx *gorm.DB) error) error { db.Mutex.Lock() err := db.Transaction(txFunc) db.Mutex.Unlock() return err } func BlogGormClient() *DB { //为空就初始化 if blogGorm == nil { gormInitMutex.Lock() if blogGorm == nil { path := bootstrap.Config.Database.Sqlite.BlogPath logrus.Info("数据库文件位置:", path) _, err := os.Stat(path) if err != nil || os.IsNotExist(err) { panic("SQLite数据库文件不存在!") } orm, err := gorm.Open(sqlite.Open(path), &gorm.Config{}) if err != nil { panic("BlogGorm初始化异常!" + err.Error()) } // orm.Exec("PRAGMA journal_mode=WAL;") blogGorm = &DB{ DB: orm, Mutex: &sync.RWMutex{}, } logrus.Info("SQLite连接成功,BlogGorm初始化完成") } gormInitMutex.Unlock() } return blogGorm } func FileGormClient() *DB { //为空就初始化 if fileGorm == nil { gormInitMutex.Lock() if fileGorm == nil { path := bootstrap.Config.Database.Sqlite.FilePath logrus.Info("数据库文件位置:", path) // path := "./sqlite.db" _, err := os.Stat(path) if err != nil || os.IsNotExist(err) { panic("sqlite数据库文件不存在!") } orm, err := gorm.Open(sqlite.Open(path), &gorm.Config{}) if err != nil { panic("Gorm初始化异常!" + err.Error()) } // orm.Exec("PRAGMA journal_mode=WAL;") fileGorm = &DB{ DB: orm, Mutex: &sync.RWMutex{}, } logrus.Info("SQLite连接成功,FileGorm初始化完成") } gormInitMutex.Unlock() } return fileGorm }