Thema: Delphi Kleine Demo zu mORMot

Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Kleine Demo zu mORMot

  Alt 7. Nov 2011, 00:10
Also zum Thema Geschwindigkeit:

Als Http-Server ist die Performance schon etwas schlechter. Das solltest du mit der beiliegenden Demo sehen können.
Dieses liegt aber zum einen am Protokoll und an der AJAX-Kompatibilität (die kann man aber auch abschalten).
Man kann aber die Datenbank eben nicht nur per Http, sondern auch z.B. per NamedPipe den Clients zur Verfügung stellen, und das ist dann sehr schnell.

Einen direkten Vergleich mit anderen Datenbank-Systemen bzw. Übertragungsprotokollen habe ich noch nicht gemacht.
Wäre evtl. auch unfair, da diese ja schließlich nicht die Möglichkeit bieten ein komplexes Business-Objekt einfach so zu verarbeiten.

Sollte die Datenbank selber (ist ja ein SQLite3 im Hintergrund) zu langsam sein, so kann man auch eine andere Datenbank (Zugriff muss via OleDB oder ODBC möglich sein) als Basis nehmen.

Letztendlich kommt es eben darauf an, was man erreichen möchte:

Ich bin gerade dabei eine Datenschnittstelle für MDE-Geräte damit zu bauen. Der Hersteller der MDE-Software bekommt als Vorgabe mit diesem REST-Server seine Daten auszutauschen. Meine Anwendung liest dann von diesem Server die Daten ein.

Der Vorteil liegt dabei klar auf der Hand: Mir ist es von nun an egal, was für (MDE-)Geräte da Daten bereitstellen und meine Anwendung kann bleiben wie sie ist, es sei denn auf der Ebene gibt es Gründe für eine Änderung.

Mal sehen wie die Hersteller darauf reagieren ... ich gebe da mal ein Feedback

ich habe mir mal 2 Methoden zum Speichern und Laden aus deiner Demo-Anwendung rausgepickt und auf mORMot umgeschrieben.

Das Model:
Delphi-Quellcode:
type
  TSQLPanel = class( TSQLRecord )
  private
    fLeft : integer;
    fTop : integer;
  published
    property Left : integer read fLeft write fLeft;
    property Top : integer read fTop write fTop;
  end;
die Methode zum speichern:
Delphi-Quellcode:
procedure TFormTestObjectDB.odbPanel1Click(Sender: TObject);
var
  odbPanel: TodbPanel;
  lPanel : TSQLPanel;
begin
  odbPanel := Sender as TodbPanel;
  lPanel := TSQLPanel.Create;
  try
    lPanel.Left := odbPanel.Left;
    lPanel.Top := odbPanel.Top;
    lPanel.ID := odbPanel.Tag;
    fCltCon.Client.Update( lPanel );
  finally
    lPanel.Free;
  end;
end;
die Methode zum laden
Delphi-Quellcode:
procedure TFormTestObjectDB.Timer1Timer(Sender: TObject);
var
  lPanel : TSQLPanel;
begin
  lPanel := TSQLPanel.Create;
  try
    if fCltCon.Client.Retrieve( 1, lPanel ) then
    begin
      odbPanel1.Left := lPanel.Left;
      odbPanel1.Top := lPanel.Top;
      odbPanel4.Left := lPanel.Left;
      odbPanel4.Top := lPanel.Top;
    end;
    if fCltCon.Client.Retrieve( 2, lPanel ) then
    begin
      odbPanel2.Left := lPanel.Left;
      odbPanel2.Top := lPanel.Top;
      odbPanel5.Left := lPanel.Left;
      odbPanel5.Top := lPanel.Top;
    end;
    if fCltCon.Client.Retrieve( 3, lPanel ) then
    begin
      odbPanel3.Left := lPanel.Left;
      odbPanel3.Top := lPanel.Top;
      odbPanel6.Left := lPanel.Left;
      odbPanel6.Top := lPanel.Top;
    end;
  finally
    lPanel.Free;
  end;
end;
es ist aber auch möglich, die Datensätze gleich auf einen Rutsch zu lesen
fCltCon.FillPrepare( fCltCon.Client, 'ID BETWEEN 1 AND 3' ); oder parametrisiert
fCltCon.FillPrepare( fCltCon.Client, 'ID BETWEEN ? AND ?', [], [ 1, 3 ] ); dann sieht die Methode so aus:
Delphi-Quellcode:
procedure TFormTestObjectDB.Timer1Timer(Sender: TObject);
var
  lPanel : TSQLPanel;
  op1, op2 : TodbPanel;
begin
  lPanel := TSQLPanel.Create;
  try
    if lPanel.FillPrepare( fCltCon.Client, 'ID BETWEEN ? AND ?', [], [ 1, 3 ] ) then
      while lPanel.FillOne do
        begin
          case lPanel.ID of
            1 : begin op1 := odbPanel1; op2 := odbPanel4; end;
            2 : begin op1 := odbPanel2; op2 := odbPanel5; end;
            3 : begin op1 := odbPanel3; op2 := odbPanel6; end;
          end;
          op1.Left := lPanel.Left; op1.Top := lPanel.Top;
          op2.Left := lPanel.Left; op2.Top := lPanel.Top;
        end;
    lPanel.FillClose;
  finally
    lPanel.Free;
  end;
end;
Ein wenig Performance könntest du aber auch dadurch gewinnen, wenn du dir für diese Zugriffe eine TSQLPanel-Instanz vorhältst, dann sparst du dir die Zeit für das ständige Create/Destroy.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 7. Nov 2011 um 00:12 Uhr)
  Mit Zitat antworten Zitat