【发布时间】:2022-12-11 06:53:48
【问题描述】:
我使用的数据库是一个全局变量,初始化读取文件sql-repo.db:
const dbFile = "sql-repo.db"
var globalDB *LocalDB
type LocalDB struct {
Path string
handle *sql.DB
}
func InitSqlDB(dbDir string) error {
if globalDB != nil {
return nil
}
db := LocalDB{Path: filepath.Join(dbDir, dbFile)}
var err error
db.handle, err = sql.Open("sqlite3", db.Path)
if err != nil {
return err
}
globalDB = &db
return nil
}
有时,我会有这个数据库的更新版本,我可以下载并存储在dbDir。
我的想法:
- 使用
ATTACH DATABASE sql-repo.db AS dbMain附加第一个数据库的副本,默认使用。
当我有新的.db文件时,我也附上它ATTACH DATABASE sql-repo-new.db AS dbNew
然后我分离dbMain并将dbNew重命名为dbMain - 只需更改我的
globalDB指向的地址:
const newDBFile = "sql-repo-new.db"
func PullNewDB(dbDir string) error {
db := LocalDB{Path: filepath.Join(dbDir, newDBFile)}
var err error
db.handle, err = sql.Open("sqlite3", db.Path)
if err != nil {
return err
}
globalDB = &db
return nil
}
我怎样才能或应该如何使用新版本/文件更新我的globalDB因为如果我的代码中的客户端连接到数据库并正在查询它,我想避免任何干扰?
我是否应该将 sync.RWMutex 附加到我的 LocalDB 结构,然后在进行更新时锁定/解锁它?
或者我应该使用一个渠道来要求每个客户停止查询数据库?
感谢您的任何帮助/意见/建议!
【问题讨论】:
标签: database sqlite go mutex go-sqlite3