mormot當作內存數據庫(緩存)使用
mormot的TSQLRestStorageInMemory可以作為內存數據庫來使用。
上圖是在筆者4代I5筆記本上做的測試,增加10萬記錄,耗時:562毫秒。
增加的數據如下圖所示(默認是JSON,當然也可以存為二進制格式的):
下面附上測試代碼:
/// <author>cxg 2018-9-17</author> /// mormot 數據緩存 unit Unit1; interface uses SynCommons, SynDB, mORMot, mORMotDB, SynDBSQLite3, SynSQLite3Static, Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ToolWin, Vcl.ComCtrls; type /// <summary> /// 緩存的記錄 /// </summary> TPerson = class(TSQLRecord) private FNo: integer; FName: string; published property No: Integer read FNo write FNo; property Name: string read FName write FName; end; type TForm1 = class(TForm) Label1: TLabel; edtId: TEdit; Label2: TLabel; edtName: TEdit; ToolBar1: TToolBar; btnAdd: TToolButton; btnAdds: TToolButton; btnUpdate: TToolButton; btnFind: TToolButton; btnDelete: TToolButton; btnDeleteAll: TToolButton; mmo1: TMemo; procedure btnAddClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure btnFindClick(Sender: TObject); procedure btnAddsClick(Sender: TObject); procedure btnUpdateClick(Sender: TObject); procedure btnDeleteAllClick(Sender: TObject); procedure btnDeleteClick(Sender: TObject); private { Private declarations } FMemDB: TSQLRestStorageInMemory; FModel: TSQLModel; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.btnAddClick(Sender: TObject); var LPerson: TPerson; begin try LPerson := TPerson.Create; LPerson.No := StrToInt(edtId.Text); LPerson.Name := edtName.Text; if FMemDB.Add(LPerson, True) = 0 then begin ShowMessage('增加失敗'); end else begin edtId.Clear; edtName.Clear; edtId.SetFocus; end; finally LPerson.Free; end; end; procedure TForm1.btnAddsClick(Sender: TObject); var a, b, c: Cardinal; i: Integer; LPerson: TPerson; begin a := GetTickCount; try LPerson := TPerson.Create; for i := 0 to 100000 do begin LPerson.no:= i; LPerson.Name := RandomGUID.ToString; if FMemDB.Add(LPerson, True) = 0 then begin mmo1.Lines.Add('失敗: ' + i.ToString); end; end; b := GetTickCount; c := b - a; mmo1.Lines.Add('耗時: ' + c.ToString + ' 毫秒'); finally LPerson.Free; end; end; procedure TForm1.btnDeleteAllClick(Sender: TObject); begin FMemDB.DropValues; end; procedure TForm1.btnDeleteClick(Sender: TObject); var LNo: string; begin LNo := ''; if FMemDB.Delete(TPerson, LNo) then begin mmo1.Lines.Add('刪除成功'); end else begin mmo1.Lines.Add('刪除失敗'); end; end; procedure TForm1.btnFindClick(Sender: TObject); var LPerson: TPerson; begin LPerson := TPerson.Create(FMemDB, 'Id=?', [edtId.Text]); if LPerson <> nil then begin edtId.Text := LPerson.no.ToString; edtName.Text := LPerson.Name; end; end; procedure TForm1.btnUpdateClick(Sender: TObject); var LPerson: TPerson; begin LPerson := TPerson.Create; LPerson.no := StrToInt(edtId.Text); LPerson.Name := edtName.Text; if FMemDB.Update(LPerson) then begin mmo1.Lines.Add('更新成功: ' + LPerson.no.ToString); end else begin mmo1.Lines.Add('更新失敗: ' + LPerson.no.ToString); end; LPerson.Free; end; procedure TForm1.FormCreate(Sender: TObject); begin FModel := TSQLModel.Create([TPerson]); FMemDB := TSQLRestStorageInMemory.Create(TPerson, nil, 'test.db'); end; procedure TForm1.FormDestroy(Sender: TObject); begin FModel.Free; FMemDB.Free; end; end.