Fix shutdown handling and optimize SQLite settings

- Fix Ctrl-C shutdown by using fx.Shutdowner instead of just canceling context
- Pass context from fx lifecycle to rw.Run() for proper cancellation
- Adjust WAL settings: checkpoint at 50MB, max size 100MB
- Reduce busy timeout from 30s to 2s to fail fast on lock contention

This should fix the issue where Ctrl-C doesn't cause shutdown and improve
database responsiveness under heavy load.
This commit is contained in:
2025-07-28 16:52:52 +02:00
parent 21921a170c
commit b9b0792df9
2 changed files with 26 additions and 27 deletions

View File

@@ -91,19 +91,19 @@ func New(cfg *config.Config, logger *logger.Logger) (*Database, error) {
func (d *Database) Initialize() error {
// Set SQLite pragmas for better performance
pragmas := []string{
"PRAGMA journal_mode=WAL", // Write-Ahead Logging
"PRAGMA synchronous=OFF", // Don't wait for disk writes
"PRAGMA cache_size=-2097152", // 2GB cache (negative = KB)
"PRAGMA temp_store=MEMORY", // Use memory for temp tables
"PRAGMA mmap_size=536870912", // 512MB memory-mapped I/O
"PRAGMA wal_autocheckpoint=1000", // Checkpoint every 1000 pages (4MB with 4KB pages)
"PRAGMA wal_checkpoint(PASSIVE)", // Checkpoint now
"PRAGMA page_size=4096", // Standard page size
"PRAGMA busy_timeout=30000", // 30 second busy timeout
"PRAGMA locking_mode=NORMAL", // Allow multiple connections
"PRAGMA read_uncommitted=true", // Allow dirty reads for better concurrency
"PRAGMA journal_size_limit=67108864", // Limit WAL to 64MB
"PRAGMA analysis_limit=0", // Disable automatic ANALYZE
"PRAGMA journal_mode=WAL", // Write-Ahead Logging
"PRAGMA synchronous=OFF", // Don't wait for disk writes
"PRAGMA cache_size=-2097152", // 2GB cache (negative = KB)
"PRAGMA temp_store=MEMORY", // Use memory for temp tables
"PRAGMA mmap_size=536870912", // 512MB memory-mapped I/O
"PRAGMA wal_autocheckpoint=12500", // Checkpoint every 12.5k pages (50MB with 4KB pages)
"PRAGMA wal_checkpoint(PASSIVE)", // Checkpoint now
"PRAGMA page_size=4096", // Standard page size
"PRAGMA busy_timeout=2000", // 2 second busy timeout
"PRAGMA locking_mode=NORMAL", // Allow multiple connections
"PRAGMA read_uncommitted=true", // Allow dirty reads for better concurrency
"PRAGMA journal_size_limit=104857600", // Limit WAL to 100MB
"PRAGMA analysis_limit=0", // Disable automatic ANALYZE
}
for _, pragma := range pragmas {