Connection String Reference
This document provides information about Stoolap connection string formats and their usage.
Connection String Basics
Stoolap connection strings follow a URL-like format:
scheme://[path][?options]
Where:
schemespecifies the storage mode (memory or file)pathprovides location information for persistent storageoptionsare optional query parameters for configuration
Storage Modes
Stoolap supports two storage modes:
In-Memory Mode (memory://)
memory://
All data stored in RAM:
- Maximum performance for temporary data
- Full MVCC transaction isolation
- Data is lost when the process terminates
- Ideal for testing and ephemeral workloads
Persistent Mode (file://)
file:///path/to/data
Data persisted to disk:
- WAL (Write-Ahead Logging) for crash recovery
- Immutable cold volumes for fast startup on large tables
- Optional backup snapshots for disaster recovery
- Same MVCC features as memory mode
- Survives process restarts
Examples:
file:///data/mydb
file:///Users/username/stoolap/data
file:///tmp/test_db
Configuration Options
Configuration can be set via query parameters in the connection string:
file:///path/to/data?sync_mode=normal&checkpoint_interval=60
| Option | Values | Default | Description |
|---|---|---|---|
sync / sync_mode |
none/off, normal, full (or 0, 1, 2) | normal | WAL synchronization mode. none/off=no fsync (data durable at checkpoint), normal=fsync every 1s, full=fsync every write |
checkpoint_interval |
Integer (seconds) | 60 | Time between automatic checkpoint cycles |
compact_threshold |
Integer (min 2) | 4 | Sub-target volumes per table before merging |
keep_snapshots |
Integer | 3 | Backup snapshots to retain per table |
wal_flush_trigger |
Integer (bytes) | 32768 | Size in bytes before WAL flush |
wal_buffer_size |
Integer (bytes) | 65536 | WAL write buffer size |
wal_max_size |
Integer (bytes) | 67108864 | Maximum WAL file size (64MB) |
wal_compression |
on/off | on | Enable LZ4 compression for WAL entries |
volume_compression |
on/off | on | Enable LZ4 compression for cold volume files |
compression |
on/off | on | Enable LZ4 compression for both WAL and volumes |
compression_threshold |
Integer (bytes) | 64 | Minimum size for WAL compression |
checkpoint_on_close |
on/off | on | Seal all hot rows to volumes on clean shutdown |
commit_batch_size |
Integer | 100 | Commits to batch before sync |
sync_interval_ms / sync_interval |
Integer (ms) | 1000 | Minimum time between syncs in normal mode |
target_volume_rows |
Integer | 1048576 | Target rows per cold volume (min: 65536). Controls compaction split boundary. |
Legacy parameter names are accepted for backward compatibility:
snapshot_intervalmaps tocheckpoint_intervalsnapshot_compressionmaps tocompression(sets both WAL and volume)
Cleanup Options
| Option | Values | Default | Description |
|---|---|---|---|
cleanup |
on/off | on | Enable/disable background cleanup thread |
cleanup_interval |
Integer (seconds) | 60 | Interval between automatic cleanup runs |
deleted_row_retention |
Integer (seconds) | 300 | How long deleted rows are kept before permanent removal |
transaction_retention |
Integer (seconds) | 3600 | How long stale transaction metadata is kept |
The background cleanup thread periodically removes deleted rows, old version chains, and stale transaction metadata. On WASM where background threads are unavailable, use the VACUUM command for manual cleanup.
Example:
file:///data/mydb?cleanup_interval=30&deleted_row_retention=60
file:///data/mydb?cleanup=off
Sync Mode Details
| Mode | Value | Description |
|---|---|---|
| none | 0 | No fsync. Data is durable only after checkpoint writes volumes to disk. |
| normal | 1 | Fsync every 1 second (configurable via sync_interval_ms). DDL fsyncs immediately. Comparable to SQLite WAL + synchronous=NORMAL. |
| full | 2 | Fsync on every write operation. Maximum durability. |
Usage Examples
Rust API
use stoolap::Database;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// In-memory database
let db = Database::open("memory://")?;
// Or create a unique in-memory instance
let db = Database::open_in_memory()?;
// Persistent database
let db = Database::open("file:///data/mydb")?;
// With configuration options
let db = Database::open("file:///data/mydb?sync_mode=full&checkpoint_interval=60")?;
// Execute SQL
db.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)", ())?;
db.execute("INSERT INTO users VALUES ($1, $2)", (1, "Alice"))?;
// Query data
for row in db.query("SELECT * FROM users WHERE id = $1", (1,))? {
let row = row?;
let name: String = row.get_by_name("name")?;
println!("Name: {}", name);
}
Ok(())
}
Command Line
# In-memory database (default)
stoolap
# Persistent database
stoolap --db "file:///data/mydb"
# With configuration via DSN
stoolap --db "file:///data/mydb?sync_mode=full"
# With configuration via CLI flags
stoolap --db "file:///data/mydb" --sync full --checkpoint-interval 30
# Execute a query directly
stoolap --db "file:///data/mydb" -e "SELECT * FROM users"
# Execute from a SQL file
stoolap --db "file:///data/mydb" -f script.sql
Backup and Restore
# Create a backup snapshot
stoolap --db "file:///data/mydb" --snapshot
# Restore from a specific backup by timestamp (recommended)
stoolap --db "file:///data/mydb" --restore "20260315-100000.000"
# Restore from latest backup
stoolap --db "file:///data/mydb" --restore
# Recovery from corrupted volumes/manifests (cleans up first)
stoolap --db "file:///data/mydb" --reset-volumes --restore
The --restore command opens the database and replaces current data with snapshot data. If volumes or manifests are corrupted, use --reset-volumes --restore which removes bad on-disk state before opening.
PRAGMA Configuration
You can also configure settings after connection using PRAGMA commands:
-- Set configuration values
PRAGMA sync_mode = 2;
PRAGMA checkpoint_interval = 60;
PRAGMA compact_threshold = 4;
PRAGMA keep_snapshots = 5;
PRAGMA wal_flush_trigger = 500;
-- Read current values
PRAGMA sync_mode;
PRAGMA checkpoint_interval;
PRAGMA keep_snapshots;
-- Create a backup snapshot
PRAGMA SNAPSHOT;
-- Restore from a backup snapshot
PRAGMA RESTORE;
PRAGMA RESTORE = '20260315-100000.000';
-- Run checkpoint cycle manually
PRAGMA CHECKPOINT;
-- Manual cleanup (works on all platforms including WASM)
VACUUM;
VACUUM table_name;
PRAGMA vacuum;
See the PRAGMA Commands documentation for details.
Best Practices
- Development: Use
memory://for fast iteration and testing - Production: Use
file://with appropriatesync_mode - Critical data: Set
sync_mode=fullfor maximum durability - High throughput: Use
sync_mode=normalwith the default checkpoint cycle - Backup: Use
PRAGMA SNAPSHOTor--snapshotfor backups,keep_snapshotsto control retention - Recovery: Use
--reset-volumes --restorefrom CLI to recover from corrupted state