From 78d07e2fda8816fb41b91de2e84f8f4b3df8180e Mon Sep 17 00:00:00 2001 From: Jeremy Lin Date: Tue, 26 Apr 2022 17:55:19 -0700 Subject: [PATCH] Add default connection-scoped pragmas for SQLite `PRAGMA busy_timeout = 5000` tells SQLite to keep trying for up to 5000 ms when there is lock contention, rather than aborting immediately. This should hopefully prevent the vast majority of "database is locked" panics observed since the async transition. `PRAGMA synchronous = NORMAL` trades better performance for a small potential loss in durability (the default is `FULL`). The SQLite docs recommend `NORMAL` as "a good choice for most applications running in WAL mode". --- .env.template | 2 +- src/config.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.env.template b/.env.template index 68c487f4..5ff34db7 100644 --- a/.env.template +++ b/.env.template @@ -34,7 +34,7 @@ ## For example, this can be used to run connection-scoped pragma statements. ## ## Statements to run when creating a new SQLite connection -# SQLITE_CONN_INIT="" +# SQLITE_CONN_INIT="PRAGMA busy_timeout = 5000; PRAGMA synchronous = NORMAL;" ## Statements to run when creating a new MySQL connection # MYSQL_CONN_INIT="" ## Statements to run when creating a new PostgreSQL connection diff --git a/src/config.rs b/src/config.rs index cd6dc138..eaabdf6b 100644 --- a/src/config.rs +++ b/src/config.rs @@ -521,7 +521,7 @@ make_config! { database_max_conns: u32, false, def, 10; /// SQLite connection init |> Statements to run when creating a new SQLite connection - sqlite_conn_init: String, false, def, "".to_string(); + sqlite_conn_init: String, false, def, "PRAGMA busy_timeout = 5000; PRAGMA synchronous = NORMAL;".to_string(); /// MySQL connection init |> Statements to run when creating a new MySQL connection mysql_conn_init: String, false, def, "".to_string();