@@ -5,6 +5,148 @@ All notable changes to this project will be documented in this file.
55The format is based on [ Keep a Changelog] ( https://keepachangelog.com/en/1.0.0/ ) ,
66and this project adheres to [ Semantic Versioning] ( https://semver.org/spec/v2.0.0.html ) .
77
8+ ## [ Unreleased]
9+
10+ ## [ 0.3.0] - 2025-01-04
11+
12+ ### Added
13+
14+ #### 🔒 Production Concurrency Utilities
15+
16+ Based on [ Jellyfin's real-world SQLite locking experience] ( https://jellyfin.org/posts/SQLite-locking/ ) , we've added three opt-in concurrency helpers for production deployments:
17+
18+ - ** ` enableWAL(db, options?) ` ** - Configure Write-Ahead Logging mode
19+ - Enables WAL mode for better read concurrency (multiple readers during writes)
20+ - Sets optimal pragmas: synchronous=NORMAL, busy_timeout=5000ms, cache_size=64MB
21+ - Configures WAL autocheckpoint and journal size limits
22+ - Customizable options for advanced use cases
23+ - Returns database instance for method chaining
24+
25+ - ** ` withRetry(operation, options?) ` ** - Exponential backoff retry logic
26+ - Automatically retries on SQLITE_BUSY/database locked errors
27+ - Exponential backoff: 10ms → 20ms → 40ms → 80ms → 160ms
28+ - Optional jitter to prevent thundering herd
29+ - Preserves error context after max retries
30+ - Works with both sync and async operations
31+ - Default 5 retries, fully customizable
32+
33+ - ** ` WriteQueue ` ** - Pessimistic locking queue
34+ - FIFO queue serializes all write operations
35+ - Eliminates lock contention entirely
36+ - Predictable latency for high-concurrency scenarios
37+ - Queue length and processing status monitoring
38+ - Handles both sync and async operations
39+ - Error handling without breaking queue
40+
41+ - ** ` initializeConcurrency(db, options?) ` ** - Convenience function
42+ - Combines WAL mode setup with write queue initialization
43+ - Returns ` { db, writeQueue } ` for immediate use
44+
45+ #### 📚 Comprehensive Documentation (1,892 lines)
46+
47+ - ** [ CONCURRENCY-BEST-PRACTICES.md] ( docs/CONCURRENCY-BEST-PRACTICES.md ) ** (500+ lines)
48+ - Three locking strategies: No-Lock, Optimistic (retry), Pessimistic (queue)
49+ - WAL mode configuration and best practices
50+ - Transaction batching patterns (20x speedup)
51+ - Multi-process architecture patterns
52+ - Production monitoring and debugging
53+ - Decision matrices for strategy selection
54+ - Real-world usage examples
55+
56+ - ** [ COMPETITIVE-ANALYSIS.md] ( docs/COMPETITIVE-ANALYSIS.md ) ** (400+ lines)
57+ - Comparison with Neo4j, ArangoDB, OrientDB, Memgraph, TinkerPop, gun.js, level-graph
58+ - 20+ dimension comparison matrix
59+ - Performance benchmarks: 500x smaller footprint, 3000x faster startup
60+ - Resource usage comparisons
61+ - Use case decision matrices
62+ - Market positioning as "High-Performance Embedded" solution
63+
64+ - ** [ LIMITATIONS.md] ( docs/LIMITATIONS.md ) ** (500+ lines)
65+ - Enhanced concurrency section with Jellyfin findings
66+ - WAL mode, retry logic, and write queue patterns
67+ - Scale limits and performance degradation tables
68+ - Security, operational, and performance concerns
69+ - Mitigation strategies with code examples
70+ - Severity classifications and decision matrices
71+
72+ #### ✅ Testing
73+
74+ - 32 comprehensive tests for concurrency utilities (all passing)
75+ - Tests cover all three locking strategies
76+ - Integration tests with full concurrency stack
77+ - TDD approach with tests written first
78+
79+ ### Changed
80+
81+ - ** Exposed ` Database.db ` as public readonly** for advanced usage
82+ - Allows direct access to better-sqlite3 instance
83+ - Enables pragma configuration (WAL mode, timeouts, etc.)
84+ - Maintains encapsulation with readonly modifier
85+ - Enhanced README with concurrency utility examples
86+ - Updated quick start to show production patterns
87+
88+ ### Performance
89+
90+ - WAL mode enables concurrent reads during writes
91+ - WriteQueue eliminates lock contention overhead
92+ - 7.11x faster merge operations with proper indexing (from v0.2.0)
93+ - 20x speedup with transaction batching
94+
95+ ### Use Cases
96+
97+ Perfect for:
98+ - Web applications with concurrent users (>10 simultaneous writes)
99+ - API servers with bursty write patterns
100+ - Background job processing with multiple workers
101+ - Desktop/mobile apps needing offline-first architecture
102+ - Production deployments requiring reliability
103+
104+ ### Migration Guide
105+
106+ All concurrency utilities are ** opt-in** . Existing code continues to work without changes.
107+
108+ ** Basic (Most Common):**
109+ ``` typescript
110+ import { GraphDatabase , enableWAL } from ' sqlite-graph' ;
111+
112+ const db = new GraphDatabase (' ./graph.db' );
113+ enableWAL (db ); // Better read concurrency
114+ ```
115+
116+ ** With Retry Logic:**
117+ ``` typescript
118+ import { withRetry } from ' sqlite-graph' ;
119+
120+ await withRetry (() =>
121+ db .mergeNode (' Company' , { name: ' TechCorp' }, { industry: ' SaaS' })
122+ );
123+ ```
124+
125+ ** High-Concurrency:**
126+ ``` typescript
127+ import { WriteQueue } from ' sqlite-graph' ;
128+
129+ const writeQueue = new WriteQueue ();
130+ await writeQueue .enqueue (() =>
131+ db .createNode (' Job' , { title: ' Engineer' })
132+ );
133+ ```
134+
135+ ** Full Stack (Maximum Safety):**
136+ ``` typescript
137+ import { initializeConcurrency , withRetry } from ' sqlite-graph' ;
138+
139+ const { db, writeQueue } = initializeConcurrency (new GraphDatabase (' ./graph.db' ));
140+
141+ await writeQueue .enqueue (() =>
142+ withRetry (() =>
143+ db .mergeNode (' Job' , { url }, { title: ' Engineer' })
144+ )
145+ );
146+ ```
147+
148+ ---
149+
8150## [ 0.2.0] - 2025-11-02
9151
10152### Added
0 commit comments