My previous questionDelphi 2010: Pas de fil vs fils - TSQLConnection et TSQLDataSet
De la réponse ci-dessus, signifie que si dans mes fils a créer des objets, je vais faire face au goulot d'étranglement des allocations de mémoire/désallocations?
J'ai un cas que j'ai besoin de créer TSQLConnection et TSQLDataSet pour interroger les données de 5 tables de la base de données, chaque table a plus de 10000 enregistrements. Je vais donc créer 5 threads, chaque thread accepte un nom de table comme paramètre via le constructeur. Malheureusement, je ne peux pas obtenir plus de différence évidente de temps pris. J'ai écrit les codes suivants:
TMyThread = class(TThread)
private
FTableName: string;
protected
procedure Execute; override;
public
constructor Create(const CreateSuspended: Boolean; const aTableName: string);
reintroduce; overload;
end;
constructor TMyThread.Create(const CreateSuspended: Boolean; const aTableName);
begin
inherited Create(CreateSuspended);
FTableName := aTableName;
FreeOnTerminate := True;
end;
procedure TMyThread.Execute;
var C: TSQLConnection;
D: TDataSet;
begin
C := NewSQLConnection;
try
D := NewSQLDataSet(C, FTableName);
try
D.Open;
while not D.Eof do begin
// Do something
D.Next;
end;
finally
D.Free;
end;
finally
C.Free;
end;
end;
function NewSQLConnection: TSQLConnection;
begin
Result := TSQLConnection.Create(nil);
// Setup TSQLConnection
end;
function NewSQLDataSet(const aConn: TSQLConnection; const aTableName: string):
TSQLDataSet;
begin
Result := TSQLDataSet.Create(aConn);
Result.CommandText := Format('SELECT * FROM %s', [aTableName]);
Result.SQLConnection := aConn;
end;
Existe-t-il un conseil ou une recommandation pour ce cas?
À quelle base de données êtes-vous connecté? Est-ce distant ou local? –
Je me connecte à la base de données firebird en tant qu'hôte local. – lmengyew
Pouvez-vous afficher le graphique CPU de votre application et de Firebird? (utiliser l'explorateur de processus pour cela) –