Skip to content

Commit 4341d7f

Browse files
authored
fix(sql): replace Mutex with RwLock to enable concurrent SQL execution (#1972)
1 parent 77149dc commit 4341d7f

File tree

3 files changed

+16
-13
lines changed

3 files changed

+16
-13
lines changed

.changes/fix-sql-blocking.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
sql: patch
3+
---
4+
5+
Replace `Mutex` with `RwLock` to enable concurrent SQL execution.

plugins/sql/src/commands.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ pub(crate) async fn load<R: Runtime>(
2323
pool.migrate(&migrator).await?;
2424
}
2525

26-
db_instances.0.lock().await.insert(db.clone(), pool);
26+
db_instances.0.write().await.insert(db.clone(), pool);
2727

2828
Ok(db)
2929
}
@@ -36,7 +36,7 @@ pub(crate) async fn close(
3636
db_instances: State<'_, DbInstances>,
3737
db: Option<String>,
3838
) -> Result<bool, crate::Error> {
39-
let mut instances = db_instances.0.lock().await;
39+
let instances = db_instances.0.read().await;
4040

4141
let pools = if let Some(db) = db {
4242
vec![db]
@@ -45,9 +45,7 @@ pub(crate) async fn close(
4545
};
4646

4747
for pool in pools {
48-
let db = instances
49-
.get_mut(&pool)
50-
.ok_or(Error::DatabaseNotLoaded(pool))?;
48+
let db = instances.get(&pool).ok_or(Error::DatabaseNotLoaded(pool))?;
5149
db.close().await;
5250
}
5351

@@ -62,9 +60,9 @@ pub(crate) async fn execute(
6260
query: String,
6361
values: Vec<JsonValue>,
6462
) -> Result<(u64, LastInsertId), crate::Error> {
65-
let mut instances = db_instances.0.lock().await;
63+
let instances = db_instances.0.read().await;
6664

67-
let db = instances.get_mut(&db).ok_or(Error::DatabaseNotLoaded(db))?;
65+
let db = instances.get(&db).ok_or(Error::DatabaseNotLoaded(db))?;
6866
db.execute(query, values).await
6967
}
7068

@@ -75,8 +73,8 @@ pub(crate) async fn select(
7573
query: String,
7674
values: Vec<JsonValue>,
7775
) -> Result<Vec<IndexMap<String, JsonValue>>, crate::Error> {
78-
let mut instances = db_instances.0.lock().await;
76+
let instances = db_instances.0.read().await;
7977

80-
let db = instances.get_mut(&db).ok_or(Error::DatabaseNotLoaded(db))?;
78+
let db = instances.get(&db).ok_or(Error::DatabaseNotLoaded(db))?;
8179
db.select(query, values).await
8280
}

plugins/sql/src/lib.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ use tauri::{
2929
plugin::{Builder as PluginBuilder, TauriPlugin},
3030
Manager, RunEvent, Runtime,
3131
};
32-
use tokio::sync::Mutex;
32+
use tokio::sync::{Mutex, RwLock};
3333

3434
use std::collections::HashMap;
3535

3636
#[derive(Default)]
37-
pub struct DbInstances(pub Mutex<HashMap<String, DbPool>>);
37+
pub struct DbInstances(pub RwLock<HashMap<String, DbPool>>);
3838

3939
#[derive(Serialize)]
4040
#[serde(untagged)]
@@ -140,7 +140,7 @@ impl Builder {
140140

141141
tauri::async_runtime::block_on(async move {
142142
let instances = DbInstances::default();
143-
let mut lock = instances.0.lock().await;
143+
let mut lock = instances.0.write().await;
144144

145145
for db in config.preload {
146146
let pool = DbPool::connect(&db, app).await?;
@@ -168,7 +168,7 @@ impl Builder {
168168
if let RunEvent::Exit = event {
169169
tauri::async_runtime::block_on(async move {
170170
let instances = &*app.state::<DbInstances>();
171-
let instances = instances.0.lock().await;
171+
let instances = instances.0.read().await;
172172
for value in instances.values() {
173173
value.close().await;
174174
}

0 commit comments

Comments
 (0)