meldestelle/docs/database/STARTUP_ORDER_ANALYSIS.md
2025-07-25 23:16:16 +02:00

4.1 KiB

Startup Order Analysis - Database Initialization

Current Startup Flow

1. Gateway Startup (Primary Database Initialization)

  • File: infrastructure/gateway/src/main/kotlin/at/mocode/infrastructure/gateway/Application.kt
  • Process:
    1. Load configuration (AppConfig)
    2. Initialize database connection (DatabaseFactory.init(config.database))
    3. Run migrations (MigrationSetup.runMigrations())
    4. Register with service discovery
    5. Start Ktor server

2. Service Startup (Schema Initialization Only)

  • Services: Horses, Events, Masterdata, Members
  • Process (via @PostConstruct):
    1. Log schema initialization start
    2. Initialize only service-specific schema (SchemaUtils.createMissingTablesAndColumns(...))
    3. Log schema initialization success

Resolved Issues

1. Gateway Database.connect() Inconsistency - FIXED

  • Before: Gateway used direct Database.connect() calls
  • After: Gateway uses DatabaseFactory.init() with proper connection pooling
  • Impact: Consistent database connection management across all components

2. Race Conditions in Schema Initialization - FIXED

  • Before: Gateway and services both called DatabaseFactory.init() independently
  • After: Only gateway calls DatabaseFactory.init(), services only handle their schemas
  • Impact: No more race conditions during database initialization

3. Separation of Concerns - IMPROVED

  • Before: Gateway managed schemas for all services
  • After: Each service manages only its own schema
  • Impact: Better maintainability and clearer responsibilities

Current Startup Order Coordination

Implicit Coordination (Currently Working)

The current setup provides implicit startup order coordination:

  1. Gateway starts first (typically in production deployments)

    • Initializes database connection pool
    • Runs database migrations
    • Provides API endpoints
  2. Services start independently

    • Each service initializes its own schema
    • SchemaUtils.createMissingTablesAndColumns() is idempotent
    • No conflicts since each service manages different tables

🔍 Analysis: Is Explicit Coordination Needed?

Current State: SUFFICIENT

  • Database connection is initialized once by gateway
  • Schema initialization is idempotent and service-specific
  • No race conditions or conflicts observed
  • Services can start in any order without issues

Potential Improvements (Low Priority):

  • Add health checks to ensure database is ready before service startup
  • Implement explicit dependency ordering with @DependsOn annotations
  • Add startup coordination via service discovery

Recommendations

High Priority - COMPLETED

  1. Gateway on DatabaseFactory umstellen

    • Removed direct Database.connect() calls
    • Gateway now uses DatabaseFactory.init()
  2. Schema-Initialisierung koordinieren

    • Services only initialize their own schemas
    • Removed duplicate DatabaseFactory.init() calls

📋 Medium Priority - OPTIONAL

  1. Startup-Reihenfolge explizit definieren - NOT REQUIRED
    • Current implicit coordination is sufficient
    • Services are designed to be independent
    • Schema operations are idempotent

Conclusion

The database initialization issues have been successfully resolved:

Gateway Database.connect() Inkonsistenz - FIXED Potentielle Race Conditions bei Schema-Initialisierung - FIXED Fehlende Startup-Reihenfolge-Koordination - SUFFICIENT

The current startup order coordination is adequate for the system's needs. The implicit coordination through:

  • Single database connection initialization (gateway)
  • Idempotent schema operations (services)
  • Independent service startup

...provides a robust and maintainable solution without requiring explicit dependency management.

Testing Results

All tests passed successfully:

  • Gateway builds without errors
  • All services build without errors
  • No direct Database.connect() calls in gateway
  • No DatabaseFactory.init() calls in service configurations
  • Proper separation of concerns maintained