From 849dc8317ccd0af7b3bbfeaf6a6959666128097a Mon Sep 17 00:00:00 2001 From: imeepos Date: Mon, 14 Jul 2025 12:56:30 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E9=87=8D=E5=A4=8D=E5=88=9D=E5=A7=8B=E5=8C=96=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题修复: - 修复AppState.get_database()方法重复创建数据库实例的问题 - 使用OnceLock确保数据库单例模式 - 修复video_classification_commands中重复调用get_database()的问题 技术改进: - 避免数据库循环初始化导致的日志重复输出 - 提升应用启动性能 - 确保数据库连接的一致性 这个修复解决了启动时数据库初始化日志循环输出的问题。 --- apps/desktop/src-tauri/src/app_state.rs | 13 ++++++------- .../commands/video_classification_commands.rs | 4 ++-- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/apps/desktop/src-tauri/src/app_state.rs b/apps/desktop/src-tauri/src/app_state.rs index 8d5ce40..4b6f45b 100644 --- a/apps/desktop/src-tauri/src/app_state.rs +++ b/apps/desktop/src-tauri/src/app_state.rs @@ -67,14 +67,13 @@ impl AppState { let _ = self.initialize_database(); } - let db_guard = self.database.lock().unwrap(); - if let Some(ref _database) = *db_guard { - // 创建一个新的数据库连接,使用相同的路径 + // 使用静态数据库实例,避免重复初始化 + use std::sync::OnceLock; + static DATABASE_INSTANCE: OnceLock> = OnceLock::new(); + + DATABASE_INSTANCE.get_or_init(|| { Arc::new(Database::new().unwrap()) - } else { - // 如果仍然失败,创建一个新的 - Arc::new(Database::new().unwrap()) - } + }).clone() } /// 用于测试的构造函数 diff --git a/apps/desktop/src-tauri/src/presentation/commands/video_classification_commands.rs b/apps/desktop/src-tauri/src/presentation/commands/video_classification_commands.rs index d19b155..33084b3 100644 --- a/apps/desktop/src-tauri/src/presentation/commands/video_classification_commands.rs +++ b/apps/desktop/src-tauri/src/presentation/commands/video_classification_commands.rs @@ -19,10 +19,10 @@ static QUEUE_INSTANCE: tokio::sync::OnceCell> = to async fn get_queue_instance(state: &AppState) -> Arc { QUEUE_INSTANCE.get_or_init(|| async { let database = state.get_database(); - + let video_repo = Arc::new(VideoClassificationRepository::new(database.clone())); let ai_classification_repo = Arc::new(AiClassificationRepository::new(database.clone())); - let material_repo = Arc::new(MaterialRepository::new(state.get_database().get_connection()).unwrap()); + let material_repo = Arc::new(MaterialRepository::new(database.get_connection()).unwrap()); let gemini_config = Some(GeminiConfig::default()); let service = Arc::new(VideoClassificationService::new(