Skip to content

Commit db99224

Browse files
authored
perf: Speed ​​of database initialization (#7694)
* perf: 优化非sqlite3数据库时初始化慢的问题 * refactor
1 parent b8bd14f commit db99224

File tree

4 files changed

+46
-36
lines changed

4 files changed

+46
-36
lines changed

internal/bootstrap/data/setting.go

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package data
33
import (
44
"github.com/alist-org/alist/v3/cmd/flags"
55
"github.com/alist-org/alist/v3/internal/conf"
6+
"github.com/alist-org/alist/v3/internal/db"
67
"github.com/alist-org/alist/v3/internal/model"
78
"github.com/alist-org/alist/v3/internal/offline_download/tool"
89
"github.com/alist-org/alist/v3/internal/op"
@@ -21,44 +22,53 @@ func initSettings() {
2122
if err != nil {
2223
utils.Log.Fatalf("failed get settings: %+v", err)
2324
}
24-
for i := range settings {
25-
if !isActive(settings[i].Key) && settings[i].Flag != model.DEPRECATED {
26-
settings[i].Flag = model.DEPRECATED
27-
err = op.SaveSettingItem(&settings[i])
25+
settingMap := map[string]*model.SettingItem{}
26+
for _, v := range settings {
27+
if !isActive(v.Key) && v.Flag != model.DEPRECATED {
28+
v.Flag = model.DEPRECATED
29+
err = op.SaveSettingItem(&v)
2830
if err != nil {
2931
utils.Log.Fatalf("failed save setting: %+v", err)
3032
}
3133
}
34+
settingMap[v.Key] = &v
3235
}
33-
3436
// create or save setting
37+
save := false
3538
for i := range initialSettingItems {
3639
item := &initialSettingItems[i]
3740
item.Index = uint(i)
3841
if item.PreDefault == "" {
3942
item.PreDefault = item.Value
4043
}
4144
// err
42-
stored, err := op.GetSettingItemByKey(item.Key)
43-
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
44-
utils.Log.Fatalf("failed get setting: %+v", err)
45-
continue
45+
stored, ok := settingMap[item.Key]
46+
if !ok {
47+
stored, err = op.GetSettingItemByKey(item.Key)
48+
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
49+
utils.Log.Fatalf("failed get setting: %+v", err)
50+
continue
51+
}
4652
}
47-
// save
4853
if stored != nil && item.Key != conf.VERSION && stored.Value != item.PreDefault {
4954
item.Value = stored.Value
5055
}
56+
_, err = op.HandleSettingItemHook(item)
57+
if err != nil {
58+
utils.Log.Errorf("failed to execute hook on %s: %+v", item.Key, err)
59+
continue
60+
}
61+
// save
5162
if stored == nil || *item != *stored {
52-
err = op.SaveSettingItem(item)
53-
if err != nil {
54-
utils.Log.Fatalf("failed save setting: %+v", err)
55-
}
63+
save = true
64+
}
65+
}
66+
if save {
67+
err = db.SaveSettingItems(initialSettingItems)
68+
if err != nil {
69+
utils.Log.Fatalf("failed save setting: %+v", err)
5670
} else {
57-
// Not save so needs to execute hook
58-
_, err = op.HandleSettingItemHook(item)
59-
if err != nil {
60-
utils.Log.Errorf("failed to execute hook on %s: %+v", item.Key, err)
61-
}
71+
op.SettingCacheUpdate()
6272
}
6373
}
6474
}

internal/bootstrap/db.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,20 +56,20 @@ func InitDB() {
5656
}
5757
case "mysql":
5858
{
59-
//[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...&paramN=valueN]
60-
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&tls=%s",
61-
database.User, database.Password, database.Host, database.Port, database.Name, database.SSLMode)
62-
if database.DSN != "" {
63-
dsn = database.DSN
59+
dsn := database.DSN
60+
if dsn == "" {
61+
//[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...&paramN=valueN]
62+
dsn = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&tls=%s",
63+
database.User, database.Password, database.Host, database.Port, database.Name, database.SSLMode)
6464
}
6565
dB, err = gorm.Open(mysql.Open(dsn), gormConfig)
6666
}
6767
case "postgres":
6868
{
69-
dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%d sslmode=%s TimeZone=Asia/Shanghai",
70-
database.Host, database.User, database.Password, database.Name, database.Port, database.SSLMode)
71-
if database.DSN != "" {
72-
dsn = database.DSN
69+
dsn := database.DSN
70+
if dsn == "" {
71+
dsn = fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%d sslmode=%s TimeZone=Asia/Shanghai",
72+
database.Host, database.User, database.Password, database.Name, database.Port, database.SSLMode)
7373
}
7474
dB, err = gorm.Open(postgres.Open(dsn), gormConfig)
7575
}

internal/op/setting.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ var settingGroupCacheF = func(key string, item []model.SettingItem) {
2626
settingGroupCache.Set(key, item, cache.WithEx[[]model.SettingItem](time.Hour))
2727
}
2828

29-
func settingCacheUpdate() {
29+
func SettingCacheUpdate() {
3030
settingCache.Clear()
3131
settingGroupCache.Clear()
3232
}
@@ -167,7 +167,7 @@ func SaveSettingItems(items []model.SettingItem) error {
167167
}
168168
}
169169
if len(errs) < len(items)-len(noHookItems)+1 {
170-
settingCacheUpdate()
170+
SettingCacheUpdate()
171171
}
172172
return utils.MergeErrors(errs...)
173173
}
@@ -181,7 +181,7 @@ func SaveSettingItem(item *model.SettingItem) (err error) {
181181
if err = db.SaveSettingItem(item); err != nil {
182182
return err
183183
}
184-
settingCacheUpdate()
184+
SettingCacheUpdate()
185185
return nil
186186
}
187187

@@ -193,6 +193,6 @@ func DeleteSettingItemByKey(key string) error {
193193
if !old.IsDeprecated() {
194194
return errors.Errorf("setting [%s] is not deprecated", key)
195195
}
196-
settingCacheUpdate()
196+
SettingCacheUpdate()
197197
return db.DeleteSettingItemByKey(key)
198198
}

server/common/base.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,16 @@ import (
1212
func GetApiUrl(r *http.Request) string {
1313
api := conf.Conf.SiteURL
1414
if strings.HasPrefix(api, "http") {
15-
return api
15+
return strings.TrimSuffix(api, "/")
1616
}
1717
if r != nil {
1818
protocol := "http"
1919
if r.TLS != nil || r.Header.Get("X-Forwarded-Proto") == "https" {
2020
protocol = "https"
2121
}
22-
host := r.Host
23-
if r.Header.Get("X-Forwarded-Host") != "" {
24-
host = r.Header.Get("X-Forwarded-Host")
22+
host := r.Header.Get("X-Forwarded-Host")
23+
if host == "" {
24+
host = r.Host
2525
}
2626
api = fmt.Sprintf("%s://%s", protocol, stdpath.Join(host, api))
2727
}

0 commit comments

Comments
 (0)