AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Kleine Demo zu mORMot
Thema durchsuchen
Ansicht
Themen-Optionen

Kleine Demo zu mORMot

Ein Thema von Sir Rufo · begonnen am 5. Nov 2011 · letzter Beitrag vom 30. Apr 2013
Antwort Antwort
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: Kleine Demo zu mORMot

  Alt 6. Nov 2011, 10:06
In den Sourcen von mORMot ist ein kleiner Bug bzgl. des Lock/UnLock von Records.

In der unit SQLite3Commons; muss folgendes angepasst werden
Delphi-Quellcode:
function TSQLRestClientURI.Retrieve(aID: integer; Value: TSQLRecord;
      ForUpdate: boolean=false): boolean;
var Table: TSQLRecordClass;
    Resp: RawUTF8;
begin
  result := false;
  if (self=nil) or (aID<=0) or (Value=nil) then
    exit;
  Table := Value.RecordClass;
  if ForUpdate and not Model.Lock(Table,aID) then
    exit; // error marking as locked by the client
  with URIGet(Table,aID,Resp,ForUpdate) do
  if Lo=200 then begin
    Value.FillFrom(Resp);
    Value.fInternalState := Hi;
    if ForceBlobTransfert then
      result := RetrieveBlobFields(Value) else
      result := true;
  end
  else // dieser else-Zweig fehlt :o)
    Model.UnLock(Table,aID);
end;
Der Autor ist aber recht fix mit dem Bug-Fixing, somit sollte dieser Fehler kurzfristig in den Original-Quellen behoben sein.
Fehlermeldung im Synopse-Forum
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)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: Kleine Demo zu mORMot

  Alt 6. Nov 2011, 19:10
Der Fehler ist nun auch im Repository behoben
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)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Kleine Demo zu mORMot

  Alt 6. Nov 2011, 23:03
Nabend Sir,

Danke für die Demo. Morgen werde ich wohl endlich Zeit dafür haben...

Hast Du Erfahrungen, wie die Perfomance mit großen Datenmengen ist (vor allem auch über Netzwerk und im Vergleich zu einer klassischen Datenbankanwendung)?

Ich hatte mal früher mit Firebird ein kleines (sehr billiges) Testprojekt erstellt, bei dem man 3 Panels verschieben konnte und diese Verschiebung auch parallel auf einem zweiten "Designer" erfolgte.
Das funktioniert auch im Netzwerk, wenn man nicht Firebird embedded nutzt.

Siehst Du mal eine Demomöglichkeit mit mORMot... ?
Angehängte Grafiken
Dateityp: png konzept.png (32,5 KB, 162x aufgerufen)
Angehängte Dateien
Dateityp: zip OlympicKonzeptPas.zip (17,8 KB, 46x aufgerufen)
Dateityp: zip OlympicKonzeptBin.zip (2,63 MB, 58x aufgerufen)
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

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

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
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:20
BTW: Wenn man meine Demo von Http auf NamedPipe umstellen möchte, dann muss man diese Änderungen vornehmen:
Delphi-Quellcode:
// für den Server
fSrvCon := // eine Server-Instanz für
// TmORMotServerHttp.Create( // einen Http-Server
  TmORMotServerNamedPipe.Create( // einen NamedPipe-Server
  TmORMotConfigurator.Create, // mit der Konfiguration
  CreateModel // und diesem Model
  );

// für den Client
fCltCon := // eine Client-Instanz
// TmORMotClientHttp.Create( // für den Zugriff via Http
  TmORMotClientNamedPipe.Create( // für den Zugriff via NamedPipe
  TmORMotConfigurator.Create, // mit der Konfiguration
  CreateModel // und diesem Model
  );
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)
  Mit Zitat antworten Zitat
neo4a

Registriert seit: 22. Jan 2007
Ort: Ingolstadt
362 Beiträge
 
Delphi XE2 Architect
 
#6

AW: Kleine Demo zu mORMot

  Alt 7. Nov 2011, 07:27
Wenn Du also Dein Datenmodell als Delphi-Objekt ausführst, ist die Bereitstellung eines Rest-Zugriffs auf einen DB-Server dann nur noch ein Einzeiler. Die (Delphi-) Clients können ja trotzdem noch nativ mit dem DB-Server arbeiten. Damit kann man externen Anwendungen Standard-Protokoll-Zugriff auf "seine" Datenbank ermöglichen und hat trotzdem noch exklusive Hoheit über die Geschäftsregeln (ohne umständliche Stored Procedures oder Trigger).

Das ist zwar nicht die Hauptaufgabe von mORMot, aber m.E. ein sehr netter und vor allem schnell realisierter "Seiteneffekt".
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Kleine Demo zu mORMot

  Alt 13. Nov 2011, 13:38
Ok, interessant ist das sicher. Zwei Fragen habe ich aber:

Wenn mehrere Clients den Server nutzen, wie werden dann Konflikte gehändelt?
Wenn ich eine Datenbank aus Version 1 habe und will die mit einer Programmversion 5 (mit anderer Datenstruktur) benutzen, was passiert dann? Gibt es eine Art Differenzscripte o.ä.?
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz