Estoy ejecutando un servidor web Express JS con una base de datos SQLite a la que se accede a través del paquete node sqlite3. Me doy cuenta de que cada vez que un usuario solicita un recurso cuya consulta lleva mucho tiempo, todas las cargas de página subsiguientes de cualquier otro usuario tienen que esperar a que se complete la consulta. No hay absolutamente ninguna escritura en la base de datos.
Express aún servirá páginas, pero se detendrá tan pronto como una de esas páginas intente acceder a la base de datos.
Si ejecuto una consulta en SQLite Studio mientras una página ejecuta una consulta larga, no hay demora, por lo que las aplicaciones separadas no parecen tener ningún problema.
La creación de varias instancias de sqlite.Database no resuelve el problema.
Cambiar al paquete better-sqlite3 tampoco resuelve el problema.
¿Me estoy perdiendo algo sobre cómo funciona la concurrencia de lectura en SQLite, o hay alguna limitación de Node involucrada aquí?
Aquí hay una sección simplificada de código relevante en mi servidor.
db/conectar.js
var sqlite = require('sqlite3').verbose(); var db = new sqlite.Database(dbPath, sqlite.OPEN_READWRITE|sqlite.OPEN_CREATE, function(err) { if (err) { return console.error(err.message); } console.log('Database connected successfully'); }); // Convenience wrapper db.promise = function(command, query, params) { return new Promise(function(resolve, reject) { db[command](query, params, function(error, result) { if(error) { return reject(error); } resolve(result); }); }); } module.exports = db;routeErrorHandler.js
var createError = require('http-errors'); function routeErrorHandler(fn) { return function(req, res, next) { Promise.resolve(fn(req, res, next)) .catch(err => { next(createError(500)); }); } } module.exports = routeErrorHandler;aplicación.js
var app = require('express')(); var routeErrorHandler = require('./routeErrorHandler'); var router = require('./routes/myPage'); var unrelatedRouter = require('./routes/unrelatedPage'); app.use('/myPage', routeErrorHandler(router)); app.use('/unrelatedPage', routeErrorHandler(unrelatedRouter));rutas/miPágina.js
var db = require('../db/connect'); var routeErrorHandler = require('../routeErrorHandler'); router.get('/', routeErrorHandler(async function(req, res, next) { var results = await db.promise('all', ` SELECT * FROM ManyRecords JOIN HeavyJoin USING (shared_id) `); res.json(results); }));rutas/página no relacionada.js
var db = require('../db/connect'); var routeErrorHandler = require('../routeErrorHandler'); router.get('/', routeErrorHandler(async function(req, res, next) { var results = await db.promise('all', ` SELECT * FROM UnrelatedTable JOIN NotTooHeavyJoin USING (shared_id) `); res.json(results); }));