From 19babc9c8675bbde076c6a4d2852d85e97bfb225 Mon Sep 17 00:00:00 2001 From: cijiugechu Date: Fri, 25 Oct 2024 11:02:20 +0800 Subject: [PATCH 1/3] fix(sql): replace Mutex with RwLock to enable concurrent SQL execution --- plugins/sql/src/commands.rs | 14 +++++++------- plugins/sql/src/lib.rs | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/plugins/sql/src/commands.rs b/plugins/sql/src/commands.rs index 8cd90e9c50..89140db068 100644 --- a/plugins/sql/src/commands.rs +++ b/plugins/sql/src/commands.rs @@ -23,7 +23,7 @@ pub(crate) async fn load( pool.migrate(&migrator).await?; } - db_instances.0.lock().await.insert(db.clone(), pool); + db_instances.0.write().await.insert(db.clone(), pool); Ok(db) } @@ -36,7 +36,7 @@ pub(crate) async fn close( db_instances: State<'_, DbInstances>, db: Option, ) -> Result { - let mut instances = db_instances.0.lock().await; + let instances = db_instances.0.read().await; let pools = if let Some(db) = db { vec![db] @@ -46,7 +46,7 @@ pub(crate) async fn close( for pool in pools { let db = instances - .get_mut(&pool) + .get(&pool) .ok_or(Error::DatabaseNotLoaded(pool))?; db.close().await; } @@ -62,9 +62,9 @@ pub(crate) async fn execute( query: String, values: Vec, ) -> Result<(u64, LastInsertId), crate::Error> { - let mut instances = db_instances.0.lock().await; + let instances = db_instances.0.read().await; - let db = instances.get_mut(&db).ok_or(Error::DatabaseNotLoaded(db))?; + let db = instances.get(&db).ok_or(Error::DatabaseNotLoaded(db))?; db.execute(query, values).await } @@ -75,8 +75,8 @@ pub(crate) async fn select( query: String, values: Vec, ) -> Result>, crate::Error> { - let mut instances = db_instances.0.lock().await; + let instances = db_instances.0.read().await; - let db = instances.get_mut(&db).ok_or(Error::DatabaseNotLoaded(db))?; + let db = instances.get(&db).ok_or(Error::DatabaseNotLoaded(db))?; db.select(query, values).await } diff --git a/plugins/sql/src/lib.rs b/plugins/sql/src/lib.rs index f66137b8e3..abcead6077 100644 --- a/plugins/sql/src/lib.rs +++ b/plugins/sql/src/lib.rs @@ -29,12 +29,12 @@ use tauri::{ plugin::{Builder as PluginBuilder, TauriPlugin}, Manager, RunEvent, Runtime, }; -use tokio::sync::Mutex; +use tokio::sync::{RwLock, Mutex}; use std::collections::HashMap; #[derive(Default)] -pub struct DbInstances(pub Mutex>); +pub struct DbInstances(pub RwLock>); #[derive(Serialize)] #[serde(untagged)] @@ -140,7 +140,7 @@ impl Builder { tauri::async_runtime::block_on(async move { let instances = DbInstances::default(); - let mut lock = instances.0.lock().await; + let mut lock = instances.0.write().await; for db in config.preload { let pool = DbPool::connect(&db, app).await?; @@ -168,7 +168,7 @@ impl Builder { if let RunEvent::Exit = event { tauri::async_runtime::block_on(async move { let instances = &*app.state::(); - let instances = instances.0.lock().await; + let instances = instances.0.read().await; for value in instances.values() { value.close().await; } From 76d4de53e18bc94d0ae860c37041fdcdf201ce1b Mon Sep 17 00:00:00 2001 From: cijiugechu Date: Sat, 26 Oct 2024 00:31:40 +0800 Subject: [PATCH 2/3] chore: fmt --- plugins/sql/src/commands.rs | 4 +--- plugins/sql/src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/plugins/sql/src/commands.rs b/plugins/sql/src/commands.rs index 89140db068..760d00b2d2 100644 --- a/plugins/sql/src/commands.rs +++ b/plugins/sql/src/commands.rs @@ -45,9 +45,7 @@ pub(crate) async fn close( }; for pool in pools { - let db = instances - .get(&pool) - .ok_or(Error::DatabaseNotLoaded(pool))?; + let db = instances.get(&pool).ok_or(Error::DatabaseNotLoaded(pool))?; db.close().await; } diff --git a/plugins/sql/src/lib.rs b/plugins/sql/src/lib.rs index abcead6077..352ffbec5e 100644 --- a/plugins/sql/src/lib.rs +++ b/plugins/sql/src/lib.rs @@ -29,7 +29,7 @@ use tauri::{ plugin::{Builder as PluginBuilder, TauriPlugin}, Manager, RunEvent, Runtime, }; -use tokio::sync::{RwLock, Mutex}; +use tokio::sync::{Mutex, RwLock}; use std::collections::HashMap; From 7bd466d682b8fd18ddffdc9f0e386ee250a6406e Mon Sep 17 00:00:00 2001 From: cijiugechu Date: Sat, 26 Oct 2024 02:05:31 +0800 Subject: [PATCH 3/3] docs: add changefile --- .changes/fix-sql-blocking.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changes/fix-sql-blocking.md diff --git a/.changes/fix-sql-blocking.md b/.changes/fix-sql-blocking.md new file mode 100644 index 0000000000..518f02a5cf --- /dev/null +++ b/.changes/fix-sql-blocking.md @@ -0,0 +1,5 @@ +--- +sql: patch +--- + +Replace `Mutex` with `RwLock` to enable concurrent SQL execution. \ No newline at end of file