Bonjour tout le monde,
J'ai une application Delphi (10.2.3) qui utilise Firedac et SqlLite.
L'application fonctionne très bien mais j'ai remarqué une chose étrange. lorsque j’insère un très grand nombre d'enregistrement (> 60000), la mémoire de l'application ne cesse d'augmenter, même en faisant régulièrement des commit. Je remarque aussi que physiquement ma base de donnée ne change pas pendant le process (elle garde la même taille et la même date de modification).
La fermeture de l'application (ou la base de donnée) va prendre quelques minutes (avec le pointeur SQL) et seulement à ce moment là, le fichier physique de ma base de données sera modifié.
Voici un exemple de test
Ma base de donnée est très simple
CREATE TABLE t_stritems ( IdItels INTEGER, St01 VARCHAR (200), St02 VARCHAR (200), St03 VARCHAR (200), PRIMARY KEY(IdItels) )
J'utilise un TFDconnection ainsi qu'un TFDQuery avec les paramètres par défaut. CachedUpdate est à false
Lors de la première modification un fichier .db-journal est créé dans le répertoire de la base de donnée. Ce fichier journal est supprimé automatiquement par firedac à la clôture de la base
Connect the database :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 FDConnection1.Connected := false; FDConnection1.Params.Clear; FDConnection1.Params.Add('DriverID=SQLite'); FDConnection1.Params.ADD('Database=' + Edit1.text); FDConnection1.Connected := true;
Insertion des enregistrements
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 FDQuery1.Connection := FDConnection1; FDQuery1.close; fdquery1.sql.clear; fdquery1.sql.add('DELETE FROM t_stritems'); FDConnection1.StartTransaction; fdquery1.ExecSQL; FDConnection1.Commit; fdquery1.sql.clear; fdquery1.sql.add('SELECT * FROM t_stritems'); fdquery1.Open; for i := 0 to 15 do begin for j:= 1 to 2000 do begin FDQuery1.append; FDQuery1.FieldByname('IdItels').asInteger := (i*2000) + j; FDQuery1.FieldByname('St01').asString := 'Text 01 Number : ' + FDQuery1.FieldByname('IdItels').asString; FDQuery1.FieldByname('St02').asString := 'Text 02 Number : ' + FDQuery1.FieldByname('IdItels').asString; FDQuery1.FieldByname('St03').asString := 'Text 03 Number : ' + FDQuery1.FieldByname('IdItels').asString; FDQuery1.post; end; FDConnection1.Commit; end; end;
Comment faire pour que le Commit soit pris en compte ? j'ai l'impression que les données sont vraiment insérer qu'à la fermeture de la base.
si vous avez des idées, je suis preneur
d'avance merci
Romuald
Partager