Hallo zusammen,
ich habe nun ein neues DataSnapServer-/Client Projekt aufgesetzt und dabei das Prinzip Connection Pooling eingesetzt.
Ein DataSet kann auch "ThreadSave" vom Client abgerufen werden. Es scheint alles zu funktionieren.
Wenn der Server ein DataSet bereit stellt, darf die Connection am Ende nicht beenden werden.
Ich darf auch nicht die Connection und die Query am ende auf Free setzen. Ist das so in Ordnung?
Setze ich es auf Free, bekommt der Client nix.
Ist die Methode soweit ausreichend ThreadSave?
Delphi-Quellcode:
function TdmDALZMI.GetBau(BauNr: integer): TDataSet;
var
oConn: TFDConnection;
oQuery: TFDQuery;
begin
oQuery := nil;
oConn := TFDConnection.Create(nil);
oQuery := TFDQuery.Create(nil);
try
TThread.Synchronize(nil, procedure
begin
oConn.ConnectionDefName := ZMIConnectionDefName; //<<<<< Der ConnectionManager möchte unbedingt über ConnectionDefName gebunden werden damit Pooling funktioniert.
oQuery.Connection := oConn;
oQuery.FetchOptions.AutoFetchAll := afAll; //<< Alle Record sollen vollständig abgerufen werden
oQuery.SQL.Text := 'SELECT * FROM BAU WHERE BAUNR = :BAUNR';
oQuery.Params[0].AsInteger := BauNr;
oQuery.Open;
// oConn.Close; //<<<<<<<<<<<<<<<< Ist das OK?
end);
result := oQuery;
finally
// oQuery.Free; //<<<<<<<<<<<<<<<< Ist das OK?
// oConn.Free; //<<<<<<<<<<<<<<<<
end;
end;
Clientseitig wird das DataSet so abgerufen und in eine TFDMemTable copiert:
Delphi-Quellcode:
procedure TdmZMI.GetBauDataSet(BauNr: integer);
var
LZMIClient: TdmServerMethodsZMIClient;
LDataSet: TDataSet;
begin
LZMIClient := TdmServerMethodsZMIClient.Create(dmClientContainer.CMCSQLConnection.DBXConnection);
try
LDataSet := LZMIClient.GetBau(BauNr);
mtBau.Active := False;
mtBau.CopyDataSet(LDataSet, [coStructure, coRestart, coAppend]);
mtBau.Open;
finally
LZMIClient.Free;
end;
end;
Gruß Kostas