Private
Public Access
1
0
Files
u-desk/internal/storage/sqlite.go
绝尘 6bee55b96f 新增:SFTP直连+连接池+autoConnect+文件服务器端口自动回退
- SFTP模块:连接/断开/文件CRUD/系统信息采集/base64二进制写入
- 连接池:多服务器同时在线,瞬间切换profile
- autoConnect:启动时自动连接所有非本地服务器
- 端口自动回退:listenWithFallback消除TOCTOU,解决端口冲突崩溃
- 文件服务器URL集中管理:file-server.ts消除8+处硬编码端口
- Sidebar设置面板:添加服务器/自动连接/自动刷新开关
- 修复:validateFilePath越界panic、正则预编译
- 修复:注释准确性(RemoveAll/端口8073/动态端口文档)
2026-05-04 15:33:19 +08:00

78 lines
2.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package storage
import (
"fmt"
"u-desk/internal/common"
"u-desk/internal/storage/models"
"os"
"path/filepath"
"time"
"github.com/glebarez/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
var globalDB *gorm.DB
// Init 快速初始化 SQLite兼容旧代码
func Init() (*gorm.DB, error) {
return InitFast()
}
// InitFast 超快速初始化 SQLite优化版
// 跳过不必要的检查,使用 WAL 模式,优化连接池
func InitFast() (*gorm.DB, error) {
if globalDB != nil {
return globalDB, nil
}
// 使用统一的数据目录
dataDir := common.GetUserDataDir()
if err := os.MkdirAll(dataDir, 0755); err != nil {
return nil, err
}
dbPath := filepath.Join(dataDir, "app.db")
// 极限性能优化参数:
// - journal_mode=WAL: 写前日志,大幅提升并发性能
// - synchronous=NORMAL: 降低持久性要求,提升性能
// - cache_size=-64000: 64MB 缓存,减少磁盘 I/O
// - temp_store=MEMORY: 临时表存储在内存中
// - mmap_size=30000000000: 300MB 内存映射,加速读取
// - page_size=4096: 优化页面大小
db, err := gorm.Open(sqlite.Open(dbPath+"?_pragma=journal_mode(WAL)&_pragma=synchronous(NORMAL)&_pragma=cache_size(-64000)&_pragma=temp_store(MEMORY)&_pragma=mmap_size(30000000000)&_pragma=page_size(4096)&_pragma=foreign_keys(1)"), &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent),
SkipDefaultTransaction: true, // 跳过默认事务,提升性能
PrepareStmt: true, // 预编译语句缓存
})
if err != nil {
return nil, err
}
sqlDB, err := db.DB()
if err != nil {
return nil, fmt.Errorf("获取底层SQL数据库失败: %v", err)
}
sqlDB.SetMaxOpenConns(1) // SQLite 只需要一个连接
sqlDB.SetMaxIdleConns(1)
sqlDB.SetConnMaxLifetime(time.Hour)
// AutoMigrate 在启动时执行,但只在表结构不存在时创建
// SQLite 的 AutoMigrate 很快,不会造成明显延迟
if err := db.AutoMigrate(
&models.AppConfig{},
&models.ConnectionProfile{},
); err != nil {
return nil, err
}
globalDB = db
return globalDB, nil
}
func GetDB() *gorm.DB {
return globalDB
}