我正在使用VCL TCPServer組件,該組件每次在TCP端口上接收到數據時都會觸發事件 。在事件數據可用的文本 參數的過程。因爲我想將這些數據保存到mysql數據庫中,所以我想知道哪個是最好的解決方法。 直接在過程中爲每個接收的數據使用INSERT SQL命令 或將數據存儲在內存中(即TStrings),然後每隔X(使用Timer)分鐘調用 函數執行INSERT命令?將tcp數據保存到表數據庫中
感謝
我正在使用VCL TCPServer組件,該組件每次在TCP端口上接收到數據時都會觸發事件 。在事件數據可用的文本 參數的過程。因爲我想將這些數據保存到mysql數據庫中,所以我想知道哪個是最好的解決方法。 直接在過程中爲每個接收的數據使用INSERT SQL命令 或將數據存儲在內存中(即TStrings),然後每隔X(使用Timer)分鐘調用 函數執行INSERT命令?將tcp數據保存到表數據庫中
感謝
好,
你不應該保存事件中的數據,因爲你當你這樣做,違反組件執行流程。相反:
1 - 您可以緩衝您要保存的所有數據,並且不時保存它們(不好,如果應用程序出現問題,可能會丟失大量數據)。
2 - 在事件內部,創建一個將接收數據並將其保存到數據庫的線程。這樣您就不會中斷事件流程執行,並且您將立即保存所有數據。如果你這樣做,你還將使用另一個CPU核心。那就是我會做的。
代碼解決方案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;
檢查了這一點,如果你不知道線程:Multithreading - The Delphi Way
的[當執行SQL INSERT?](HTTP你能告訴我一個例子嗎? :( – marcostT 2011-03-25 12:57:17
可能重複://計算器.com/questions/5015473/when-perform-sql-insert) – jachguate 2011-02-22 16:50:12