feat(core): Add support for SQLite connection pooling (#8722)

This commit is contained in:
कारतोफ्फेलस्क्रिप्ट™
2024-03-14 13:45:16 +01:00
committed by GitHub
parent d85d0ecf45
commit c4c319d7cf
6 changed files with 87 additions and 21 deletions

View File

@@ -171,11 +171,17 @@ export const schema = {
env: 'DB_SQLITE_DATABASE',
},
enableWAL: {
doc: 'Enable SQLite WAL mode',
doc: 'Enable SQLite WAL mode (Always enabled for pool-size > 1)',
format: Boolean,
default: false,
env: 'DB_SQLITE_ENABLE_WAL',
},
poolSize: {
doc: 'SQLite Pool Size (Setting this to 0 disables pooling)',
format: Number,
default: 0,
env: 'DB_SQLITE_POOL_SIZE',
},
executeVacuumOnStartup: {
doc: 'Runs VACUUM operation on startup to rebuild the database. Reduces filesize and optimizes indexes. WARNING: This is a long running blocking operation. Will increase start-up time.',
format: Boolean,

View File

@@ -3,6 +3,7 @@ import { Container } from 'typedi';
import type { TlsOptions } from 'tls';
import type { DataSourceOptions, LoggerOptions } from '@n8n/typeorm';
import type { SqliteConnectionOptions } from '@n8n/typeorm/driver/sqlite/SqliteConnectionOptions';
import type { SqlitePooledConnectionOptions } from '@n8n/typeorm/driver/sqlite-pooled/SqlitePooledConnectionOptions';
import type { PostgresConnectionOptions } from '@n8n/typeorm/driver/postgres/PostgresConnectionOptions';
import type { MysqlConnectionOptions } from '@n8n/typeorm/driver/mysql/MysqlConnectionOptions';
import { InstanceSettings } from 'n8n-core';
@@ -47,16 +48,26 @@ export const getOptionOverrides = (dbType: 'postgresdb' | 'mysqldb') => ({
password: config.getEnv(`database.${dbType}.password`),
});
const getSqliteConnectionOptions = (): SqliteConnectionOptions => ({
type: 'sqlite',
...getCommonOptions(),
database: path.resolve(
Container.get(InstanceSettings).n8nFolder,
config.getEnv('database.sqlite.database'),
),
enableWAL: config.getEnv('database.sqlite.enableWAL'),
migrations: sqliteMigrations,
});
const getSqliteConnectionOptions = (): SqliteConnectionOptions | SqlitePooledConnectionOptions => {
const poolSize = config.getEnv('database.sqlite.poolSize');
const commonOptions = {
...getCommonOptions(),
database: path.resolve(
Container.get(InstanceSettings).n8nFolder,
config.getEnv('database.sqlite.database'),
),
migrations: sqliteMigrations,
};
if (poolSize > 0) {
return { type: 'sqlite-pooled', poolSize, enableWAL: true, ...commonOptions };
} else {
return {
type: 'sqlite',
enableWAL: config.getEnv('database.sqlite.enableWAL'),
...commonOptions,
};
}
};
const getPostgresConnectionOptions = (): PostgresConnectionOptions => {
const sslCa = config.getEnv('database.postgresdb.ssl.ca');