From 601f5ddfe49f93d989a7a1edd73b5d580b20ebfa Mon Sep 17 00:00:00 2001 From: Gerald Leban Date: Sat, 10 Oct 2026 10:31:21 +0200 Subject: [PATCH] perf(database): configure sqlite WAL mode, normal synchronous, and 5s busy timeout --- config/database.ts | 9 +++++++++ tests/unit/database_wal.spec.ts | 20 ++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 tests/unit/database_wal.spec.ts diff --git a/config/database.ts b/config/database.ts index d4a5f55..a0bd5ed 100644 --- a/config/database.ts +++ b/config/database.ts @@ -21,6 +21,15 @@ const dbConfig = defineConfig({ filename: app.tmpPath('db.sqlite3'), }, + pool: { + afterCreate: (conn: any, done: any) => { + conn.pragma('journal_mode = WAL') + conn.pragma('synchronous = NORMAL') + conn.pragma('busy_timeout = 5000') + done(null, conn) + }, + }, + /** * Required by Knex for SQLite defaults. */ diff --git a/tests/unit/database_wal.spec.ts b/tests/unit/database_wal.spec.ts new file mode 100644 index 0000000..92f722b --- /dev/null +++ b/tests/unit/database_wal.spec.ts @@ -0,0 +1,20 @@ +import { test } from '@japa/runner' +import db from '@adonisjs/lucid/services/db' + +test.group('SQLite WAL Concurrency', () => { + test('verifies connection enables WAL mode, normal synchronous, and 5000ms busy timeout', async ({ + assert, + }) => { + const journalModeResult = await db.rawQuery('PRAGMA journal_mode;') + const busyTimeoutResult = await db.rawQuery('PRAGMA busy_timeout;') + const synchronousResult = await db.rawQuery('PRAGMA synchronous;') + + const journalMode = (journalModeResult[0]?.journal_mode ?? '').toLowerCase() + const busyTimeout = Number(busyTimeoutResult[0]?.timeout) + const synchronous = Number(synchronousResult[0]?.synchronous) + + assert.equal(journalMode, 'wal') + assert.equal(busyTimeout, 5000) + assert.equal(synchronous, 1) + }) +}) -- 2.54.0