- SQLite 纯 Go 驱动(modernc.org/sqlite),支持 CGO_ENABLED=0 跨平台编译
- 优化并发性能(WAL 模式),解决 "database is locked" 错误 - Docker 跨平台支持 `host.docker.internal` 访问宿主机服务 - 精简文档和部署指南
This commit is contained in:
@@ -11,6 +11,7 @@ import (
|
||||
"gorm.io/driver/mysql"
|
||||
"gorm.io/driver/sqlite"
|
||||
"gorm.io/gorm"
|
||||
_ "modernc.org/sqlite"
|
||||
)
|
||||
|
||||
func NewDatabase(cfg config.DatabaseConfig) (*gorm.DB, error) {
|
||||
@@ -31,7 +32,13 @@ func NewDatabase(cfg config.DatabaseConfig) (*gorm.DB, error) {
|
||||
var err error
|
||||
|
||||
if cfg.Type == "sqlite" {
|
||||
db, err = gorm.Open(sqlite.Open(dsn), gormConfig)
|
||||
// 使用 modernc.org/sqlite 纯 Go 驱动(无需 CGO)
|
||||
// 添加并发优化参数:WAL 模式、busy_timeout、cache
|
||||
dsnWithParams := dsn + "?_journal_mode=WAL&_busy_timeout=5000&_synchronous=NORMAL&cache=shared"
|
||||
db, err = gorm.Open(sqlite.Dialector{
|
||||
DriverName: "sqlite",
|
||||
DSN: dsnWithParams,
|
||||
}, gormConfig)
|
||||
} else {
|
||||
db, err = gorm.Open(mysql.Open(dsn), gormConfig)
|
||||
}
|
||||
@@ -45,8 +52,14 @@ func NewDatabase(cfg config.DatabaseConfig) (*gorm.DB, error) {
|
||||
return nil, fmt.Errorf("failed to get database instance: %w", err)
|
||||
}
|
||||
|
||||
sqlDB.SetMaxIdleConns(cfg.MaxIdle)
|
||||
sqlDB.SetMaxOpenConns(cfg.MaxOpen)
|
||||
// SQLite 连接池配置(限制并发连接数)
|
||||
if cfg.Type == "sqlite" {
|
||||
sqlDB.SetMaxIdleConns(1)
|
||||
sqlDB.SetMaxOpenConns(1) // SQLite 单写入,限制为 1
|
||||
} else {
|
||||
sqlDB.SetMaxIdleConns(cfg.MaxIdle)
|
||||
sqlDB.SetMaxOpenConns(cfg.MaxOpen)
|
||||
}
|
||||
sqlDB.SetConnMaxLifetime(time.Hour)
|
||||
|
||||
if err := sqlDB.Ping(); err != nil {
|
||||
|
||||
Reference in New Issue
Block a user