Files
MyGoNavi/internal/db/sql_pool.go
Syngnat 09a1bceabf ️ perf(kingbase): 优化数据表首屏加载性能
- 连接池保留 Kingbase 空闲连接,减少重复建连开销
- 首屏数据查询完成后再加载编辑定位元数据
- 合并列、索引和外键元数据请求并保留强制刷新
- 新增连接复用、加载时序和请求缓存回归测试
2026-07-30 11:26:50 +08:00

51 lines
1.5 KiB
Go

package db
import (
"database/sql"
"strings"
"time"
)
const (
defaultSQLMaxOpenConns = 4
defaultSQLMaxIdleConns = 1
defaultSQLConnMaxLifetime = 30 * time.Minute
defaultSQLConnMaxIdleTime = 30 * time.Second
// SQL Server login can be expensive. Keep its single idle connection warm
// until the normal lifetime rotation instead of expiring it at 30 seconds.
sqlServerSQLConnMaxIdleTime = defaultSQLConnMaxLifetime
)
func resolveSQLConnectionPoolMaxIdleTime(dbType string) time.Duration {
if strings.EqualFold(strings.TrimSpace(dbType), "sqlserver") {
return sqlServerSQLConnMaxIdleTime
}
return defaultSQLConnMaxIdleTime
}
func configureSQLConnectionPool(db *sql.DB, dbType string) {
if db == nil {
return
}
switch strings.ToLower(strings.TrimSpace(dbType)) {
case "sqlite", "duckdb":
return
case "oracle", "oceanbase", "kingbase":
db.SetMaxOpenConns(defaultSQLMaxOpenConns)
db.SetMaxIdleConns(defaultSQLMaxIdleConns)
db.SetConnMaxIdleTime(resolveSQLConnectionPoolMaxIdleTime(dbType))
db.SetConnMaxLifetime(defaultSQLConnMaxLifetime)
return
case "sqlserver":
db.SetMaxOpenConns(defaultSQLMaxOpenConns)
db.SetMaxIdleConns(defaultSQLMaxIdleConns)
db.SetConnMaxIdleTime(resolveSQLConnectionPoolMaxIdleTime(dbType))
db.SetConnMaxLifetime(defaultSQLConnMaxLifetime)
return
}
db.SetMaxOpenConns(defaultSQLMaxOpenConns)
db.SetMaxIdleConns(0)
db.SetConnMaxIdleTime(resolveSQLConnectionPoolMaxIdleTime(dbType))
db.SetConnMaxLifetime(defaultSQLConnMaxLifetime)
}