сохранение данных tcp в таблицу базы данных - PullRequest
1 голос
/ 16 февраля 2011

Я использую компоненты VCL TCPServer, которые генерируют события каждый раз, когда данные принимаются через порт tcp.Внутри события доступны данные в текстовом параметре процедуры.Поскольку я хочу сохранить эти данные в базе данных mysql, мне интересно, какой из них лучше всего подходит для решения этой проблемы.Непосредственно используйте команду SQL INSERT в процедуре для всех полученных данных или сохраняйте данные в памяти (например, TStrings), а затем вызывайте функцию каждые X (используя таймер) минут, оправдывая команду INSERT?

Спасибо

1 Ответ

1 голос
/ 17 марта 2011

Ну

Вы не должны сохранять свои данные внутри события, потому что вы нарушаете поток выполнения компонента, когда делаете это. Вместо этого:

1 - Вы можете буферизовать все данные, которые вы хотите сохранить, и время от времени вы сохраняете их (не очень хорошо, вы можете потерять много данных, если что-то случится с вашим приложением).

2 - Внутри события создайте поток, который будет получать данные и сохранять их в базе данных. Таким образом, вы не прерываете выполнение потока событий, и все данные будут сохранены на лету. Также вы будете использовать еще одно ядро ​​вашего процессора, если вы это сделаете. Вот что я бы сделал.

Код для решения 2 (не проверено):

TOnError = procedure(aError : string) of object;

TSaveDataThread = class(TThread)
private
  oError : string;
  oOnError : TOnError;
  oDataToSave : string;
  procedure SaveDataToDataBase;
  procedure CallOnError;
protected
  procedure Execute; override;
  constructor Create(aDataToSave : string); reintroduce;
public
  property OnError : TOnError read oOnError write oOnError;
end;

procedure TSaveDataThread.CallOnError;
begin
  oOnError(oError);
end;

constructor TSaveDataThread.Create(aDataToSave: string);
begin
  inherited Create(True);
  FreeOnTerminate := True;
  oDataToSave := aDataToSave;
end;

procedure TSaveDataThread.Execute;
begin
  inherited;
  Self.SaveDataToDataBase;
end;

procedure TSaveDataThread.SaveDataToDataBase;
begin
  //put here your code to save aDataToSave to the database
  //set error on oError
  oError := 'error';
  Synchronize(CallOnError);
end;

procedure TForm5.OnError(aError: string);
begin
  ShowMessage(aError);
end;

procedure TForm5.Button1Click(Sender: TObject);
var
  vSaveDataThread : TSaveDataThread;
  vDataToSave : string;
begin
  //change this method fot the event you want to use
  vDataToSave := 'this is the data that will be saved to the database';
  vSaveDataThread := TSaveDataThread.Create(vDataToSave);
  vSaveDataThread.OnError := Self.OnError;
  vSaveDataThread.Start;
end;

Проверьте это, если вы не знаете темы: Многопоточность - The Delphi Way

...