Files
argus-go/rear/internal/repositories/base_service.go
T

62 lines
1.2 KiB
Go

package repositories
import (
"rear/internal/db"
"sync"
)
// 写操作类型
type WriteOperation struct {
Execute func() error
Response chan error
}
// BaseService 处理数据库写操作的单线程执行
type BaseService struct {
writeQueue chan WriteOperation
once sync.Once
}
var baseService = &BaseService{
// 缓冲队列
writeQueue: make(chan WriteOperation, 1000),
}
// 初始化并启动写操作处理协程
func InitBaseService() {
baseService.once.Do(func() {
go baseService.processWriteOperations()
})
}
// 处理写操作的协程
func (s *BaseService) processWriteOperations() {
for op := range s.writeQueue {
err := op.Execute() // 串行执行每个写操作
op.Response <- err // 将结果返回给调用者
close(op.Response)
}
}
// ExecuteWrite 执行写操作(增删改)
func ExecuteWrite(fn func() error) error {
// 如果不是 SQLite,直接执行
if !db.IsSQLite() {
return fn()
}
// SQLite 走单线程队列
op := WriteOperation{
Execute: fn,
Response: make(chan error, 1),
}
baseService.writeQueue <- op // 将操作放入队列
return <-op.Response // 等待执行结果
}
// ExecuteRead 执行读操作(可以并发)
func ExecuteRead(fn func() error) error {
return fn()
}