fix: 修复大规模数据性能与流式状态清理

This commit is contained in:
chuan
2026-08-15 18:09:54 +08:00
parent 072ed8f168
commit ddebe3c4a2
15 changed files with 439 additions and 97 deletions
+24 -4
View File
@@ -59,6 +59,8 @@ CREATE TABLE IF NOT EXISTS usage_records (
CREATE INDEX IF NOT EXISTS idx_usage_records_requested_at ON usage_records(requested_at DESC, id DESC);
CREATE UNIQUE INDEX IF NOT EXISTS idx_usage_records_execution_id ON usage_records(execution_id) WHERE execution_id <> '';
CREATE INDEX IF NOT EXISTS idx_usage_records_model ON usage_records(model COLLATE NOCASE) WHERE model <> '';
CREATE INDEX IF NOT EXISTS idx_usage_records_missing_cost_model
ON usage_records(model COLLATE NOCASE, id) WHERE cost_micros IS NULL;
CREATE TABLE IF NOT EXISTS request_records (
request_id TEXT PRIMARY KEY,
@@ -234,9 +236,10 @@ const (
orphanLifecycleTieWindow = time.Millisecond
)
// SQLiteUsageRepository 使用单写连接保存全部用量记录
// SQLiteUsageRepository 使用单写连接保存事实,并用独立连接池承载只读查询
type SQLiteUsageRepository struct {
db *sql.DB
db *sql.DB
readDB *sql.DB
}
func OpenSQLiteUsage(databasePath string) (*SQLiteUsageRepository, error) {
@@ -301,6 +304,19 @@ SELECT k.id, 1, k.created_at, 0, 0 FROM managed_keys k`); err != nil {
_ = db.Close()
return nil, err
}
readDB, err := sql.Open("sqlite3", dsn)
if err != nil {
_ = db.Close()
return nil, fmt.Errorf("打开 SQLite 只读连接池: %w", err)
}
readDB.SetMaxOpenConns(4)
readDB.SetMaxIdleConns(4)
if err := readDB.Ping(); err != nil {
_ = readDB.Close()
_ = db.Close()
return nil, fmt.Errorf("连接 SQLite 只读连接池: %w", err)
}
repository.readDB = readDB
return repository, nil
}
@@ -516,7 +532,7 @@ func (r *SQLiteUsageRepository) ListRecent(ctx context.Context, limit int) ([]co
if scanLimit < limit {
scanLimit = limit
}
rows, err := r.db.QueryContext(ctx, `
rows, err := r.readDB.QueryContext(ctx, `
WITH combined AS (
SELECT
u.managed_key_id, u.request_id, u.execution_id, COALESCE(NULLIF(u.trace_id, ''), r.trace_id, '') AS trace_id,
@@ -738,5 +754,9 @@ func mergeLifecycleIntoUsage(usage, lifecycle collection.Record) collection.Reco
}
func (r *SQLiteUsageRepository) Close() error {
return r.db.Close()
var readErr error
if r.readDB != nil {
readErr = r.readDB.Close()
}
return errors.Join(readErr, r.db.Close())
}