mormot當作內存數據庫(緩存)使用


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.

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM