fix: 修复大规模数据性能与流式状态清理
This commit is contained in:
@@ -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())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user