CacheSQL : Reconstruction technique d'une base de données manuscrite

Structure initiale du prototype

La version initiale comportait une organisation simple :

com.prototype.db
├── DbManager.java          # Gestionnaire de tables principal
├── SqlParser.java          # Analyseur SQL basique
├── btree/
│   ├── BPlusTree.java      # Implémentation de l'arbre B+
│   ├── TreeNode.java       # Structure des nœuds
│   └── TreeUtils.java
├── model/
│   ├── Table.java          # Table en mémoire
│   ├── Record.java         # Enregistrement avec suppression logique
│   └── ResultSet.java      # Ensemble de résultats
└── utils/
    └── LongArray.java      # Tableau dynamique pour identifiants

Cette implémentation gérait les opérations fondamentales d'insertion, de séparation, de suppression et de fusion dans l'arbre B+. Cependant, plusieurs limitations empêchaient son utilisation en production :

  • Absence complète de tests automatisés
  • Utilisation de HashMap standard dans le gestionnaire de tables, inadapté aux environnements concurrents
  • Analyse SQL fragmentée en fonctions indépendantes
  • Interface d'accès limitée à l'appel direct depuis Java
  • Documentation inexistante

Améliorations techniques majeures

Architecture modulaire

La réorganisation a séparé les préoccupations en couches distinctes :

com.cachesql.core
├── Engine.java                 # Orchestrateur principal
├── SqlProcessor.java           # Moteur d'exécution SQL
├── btree/                      # Noyau B+ inchangé
├── model/                      # Modèles de données
├── http/                       # Couche serveur HTTP
├── replication/                # Mécanisme de réplication
└── infrastructure/
    ├── ConfigManager.java      # Gestion de configuration
    └── ExceptionHandler.java   # Gestion centralisée des erreurs

Les couches supérieures (réplication, HTTP) n'ont aucune connaissance des structures internes de l'arbre B+, assurant un découplage complet.

Gestion de la concurrence

Le remplacement de HashMap par ConcurrentHashMap a marqué le passage à une mentalité orientée production. L'implémentation utilise désormais des opérations atomiques :

// Avant : HashMap classique avec risques de collision
map.put(tableName, createTable());

// Après : Opérations atomiques thread-safe
map.putIfAbsent(tableName, createTable());
map.compute(tableName, (k, v) -> refreshTable(v));

Moteur SQL intégré

L'analyse SQL a été transformée en un processeur complet :

// Ancienne approche fragmentée
String select = parser.extractSelectClause(sql);
String from = parser.extractFromClause(sql);

// Nouvelle approche : traitement unifié
ExecutionPlan plan = sqlProcessor.compile(sql);
Result execute = plan.execute(parameters);

Cette architecture permet la mise en cache des plans d'exécution et simplifie l'intégration avec d'autres interfaces.

Stratégie de test approfondie

L'implémentation comporte désormais 72 tests organisés en deux catégories :

  • Tests unitairees (65) : couverture des opérations B+ arbres (18), traitement SQL (14), gestion mémoire (21), mécanismes de réplication (9), scénarios concurrrents (3)
  • Tests d'intégration (7) : validation des cycles complets de réplication, tolérance aux pannes et reprise automatique

Documentation complète

Sept documents techniques couvrent tous les aspects du système, depuis l'installation jusqu'aux procédures opérationnelles.

Éléments conservés

Le cœur algorithmique du B+ arbre a été préservé intact :

  • Ordre 256 : structure optimisée pour les accès mémoire
  • Suppression logique : marqueurs isDeleted maintenus pour les performances
  • Espace réservé : stratégie de sur-allocation à 10% réduisant les séparations
  • Validation des clés : mécanisme critique vérifiant la cohérence des nœuds parents

Rôle de l'IA dans le processus

L'assistance IA a été particulièrement efficace pour :

  • Génération de la structure de projet initiale
  • Création des squelettes de tests
  • Production de la documentation technique
  • Implémentation des mécanismes de gestion d'erreurs

Les décisions architecturales critiques sont restées sous contrôle humain : la conception du gestionnaire de réplication transparent, l'utilisation de buffers circulaires à taille fixe pour le journal d'opérations, et la sémantique d'upsert pour garantir l'idempotence des insertions.

Perspectives

La prochaine évolution portera sur le mécanisme de réplication maître-esclave avec récupération automatique après panne.

Étiquettes: B+tree Java database-engine SQL-parser réplication

Publié le 14 juin à 18h32