- SQLite 纯 Go 驱动(modernc.org/sqlite),支持 CGO_ENABLED=0 跨平台编译

- 优化并发性能(WAL 模式),解决 "database is locked" 错误
- Docker 跨平台支持 `host.docker.internal` 访问宿主机服务
- 精简文档和部署指南
This commit is contained in:
Connor
2026-01-16 10:30:59 +08:00
parent edba3388fb
commit 249ba3d4aa
7 changed files with 203 additions and 261 deletions

View File

@@ -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 {