Why SQLite?
SQLite is perfect for the Discount service because:- Zero Configuration: No database server to install or manage
- Lightweight: Single file database
- Read-Heavy: Optimized for frequent coupon lookups
- Simple Schema: Straightforward coupon data model
- Portable: Database file can be easily backed up and moved
- Perfect for gRPC: Minimal overhead for high-frequency calls
Configuration
Connection String
src/Services/Discount/Discount.Grpc/appsettings.json
Data Source=discountdb- Creates filediscountdbin app directoryData Source=./data/discountdb- Custom directory pathData Source=:memory:- In-memory database (testing)
Service Configuration
Program.cs Setup
src/Services/Discount/Discount.Grpc/Program.cs
UseSqlite(): Configures EF Core for SQLiteUseMigration(): Applies migrations on startup- gRPC-specific: Http2 protocol, no Swagger/HTTP endpoints
DbContext Implementation
src/Services/Discount/Discount.Grpc/Data/DiscountContext.cs
- Seed Data: Initial coupons via
HasData() - Simple Model: Single entity for coupons
- Type Safety: DbSet provides strongly-typed queries
Entity Model
Automatic Migration
Extension Method
src/Services/Discount/Discount.Grpc/Data/Extentions.cs
- Creates a service scope
- Resolves
DiscountContext - Applies pending migrations
- Creates database file if it doesn’t exist
- Seeds initial data
Migration Files
Migrations are stored inMigrations/ directory:
Usage in gRPC Service
Database Operations
Query Operations
Write Operations
Migrations
Create Migration
Apply Migration
Remove Last Migration
Docker Configuration
Dockerfile
Docker Compose
Performance Tips
Connection Pooling
Read-Only Queries
Compiled Queries
For frequently executed queries:Limitations
Concurrent Writes
SQLite has limited concurrent write support:File Locking
Be aware of file locking:- Only one writer at a time
- Multiple readers allowed
- Perfect for read-heavy workloads (like coupon lookups)
Backup and Restore
Manual Backup
Automated Backup
Troubleshooting
View Database Contents
Database Locked Error
- Enable WAL mode in connection string
- Reduce concurrent writes
- Increase busy timeout
Missing Database File
If database file doesn’t exist:Production Considerations
When to Use SQLite
Good For:- Read-heavy workloads
- Simple schemas
- Embedded/edge scenarios
- Development/testing
- Low write concurrency
- High write concurrency
- Large datasets (>100GB)
- Network access required
- Multiple writers
When to Migrate
Consider migrating to PostgreSQL/SQL Server if:- Write operations increase
- Need horizontal scaling
- Require replication
- Dataset grows significantly
Related Resources
Database Overview
Learn about polyglot persistence
SQLite Documentation
Official SQLite documentation
