Announcement

Collapse
No announcement yet.

Synchronisation von DB auf Server mit DB auf Notebook

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Synchronisation von DB auf Server mit DB auf Notebook

    Hallo erstmal ...
    Hat jemand eine Idee wie man grundsätzlich einen Abgleich von Daten auf einem Rechner (z.B. Notebook) auf einen anderen Rechner (z.B. DB-Server) realisieren kann ? Ich habe konkret das Problem, das in meiner Anwendung eine DB (z.Z. noch Parardox-Format -> Interbase 6.0 läßt grüßen..) von mehreren Clients genutzt wird und zusätzlich ein Export der <b>gesamten</b> DB auf ein Notebook möglich ist. Auch dort sollen künftig Daten <b>lokal</b> erfaßtund bearbeitet werden. Zu einem nicht definierten Zeitpunkt möchte ich dann das Notebook ins Netz hängen und die lokale DB mit der DB auf dem Server programmgesteuert abgleichen. Die Änderungen und Neuerfassungen des Notebooks sollen in die Server-DB aufgenommen und gleichzeitig die Änderungen auf der Server-Seite in das Notebook zurückgespielt werden. Priorität bei identischen Sätzen hat der jeweils jüngste. Gibt es hierfür ein Standardverfahren oder hat jemand so etwas schon einmal realisiert ? Oder weiß jemand, wo man Infos bekommt (Literatur,Beispielcode etc.)?

  • #2
    Hallo,

    wie umfangreich ist diese Datenbank? Passen alle Datensätze in den Arbeitsspeicher des Notebooks? Ist die Tabellenstruktur nicht zu kompliziert? Wenn ja, so gibt es 2 einsatzfertige Implementierungen, die mit geringstem Aufwand (nur jeweils eine zusätzliche Programmzeile) genutzt werden können: <br>
    1. ADO im LockMode <b>ltBatchOptimistic</b> (kostenlos einsetzbar) <br>
    2. MIDAS (Delphi3,4,5) oder DataSnap (Delphi 6) (kostet allerdings richtig Geld

    Comment


    • #3
      Hallo Herr Kosch,

      die DB besteht aus 6 Tabellen, von denen 4 miteinander über ID verknüpft sind. Z.z. nutze ich die BDE, arbeite also nicht mit ADO-Komponenten. Ganz klar ist mir nicht, inwieweit die MIDAS- oder DataSnap-Komponenten mir bei meinem Problem weiterhelfen können. Es geht ja nicht um ein Append/Update mit einem ClientDataset einer selektierten Datenmenge auf dem Server, sondern um 2 physisch getrennte DB mit identischen Strukturen und bei Übertragung ans Notebook zunächst identischen Inhalten. Nach der Übergabe der DB arbeiten beide Systeme (also Notebook und Netzwerk) autark und ohne Netzwerkverbindung weiter. Allein bei der automatischen Vergabe des Primärschlüssels (Paradox-"Autoinc"-Feld) bei einem Append auf dem Notebook und einem Append im Netz sehe ich riesige Probleme.

      Optimal wäre es, wenn die Anwendung auf dem Notebook identsich mit der Anwendung im Netzwerk arbeitet. Es scheint sich aber immer mehr heruszukristallisieren, daß die Notebook-Applikation andere DB-Zugriffswege implementiert haben muß ..

      Comment


      • #4
        Verwende anstatt "Autoinc" eine GUID:
        <pre>
        function GetGuid: string;
        {
        Wenn eine Netzwerkkarte im Rechner eingebaut ist, kann Windows bereits auf einen
        weltweit eindeutigen Kennzeichner für diesen Rechner zurückgreifen (MAC ist in
        die Hardware der Karte eingebrannt). Wird dann auch die Rechner-Uhr in Ruhe
        gelassen, "garantiert" CoCreateGUID die Einmaligkeit bei 10 Millionen Aufrufen
        pro Sekunde pro Rechner für die nächsten 3240 Jahre ;-)

        P.S: Falls noch Zweifel übrig bleiben, hilft vielleicht der folgende Hinweis:
        Ab Windows 2000 verwendet das Betriebssystem als interne Transaktions- und
        Activity-Nummern nur noch GUIDs, um die COM/COM+-Aufrufe zu verwalten. Wenn sich
        Windows 2000 auf die Eindeutigkeit der GUIDs verlässt, können wird das auch.
        (Quelle: Herr Kosch, Entwicklerforum)
        }
        var
        aGUID: TGUID;
        begin
        CoCreateGuid(aGUID);
        result:= GUIDToString(aGUID);
        delete(result, 1, 1); // { entfernen
        delete(result, 37, 1); // } entfernen
        end;
        </pre&gt

        Comment


        • #5
          Hallo Herr de Munck,

          das sogenannte <i>Briefcase</i>-Modell, das sowohl von ADO als auch von DataSnap (MIDAS) eingesetzt wird, geht davon aus, dass vom Notebook aus nur alle Änderungen (INSERT, UPDATE, DELETE) in die Server-Datenbank eingearbeitet werden. Dabei kann man verschiedene Stufen der Konfliktbehandlung auswählen, um auf das "doppelte Editieren" des gleichen Datensatzes reagieren zu können. Nachdem das Notebook seine Updates in die Datenbank eingespielt hat, holt es sich eine aktuelle Kopie des vollständigen Datenbestandes vom Server (so dass der andere Update-Weg gar nicht datensatzweise berücksichtigt werden muss).

          Wenn eine echte Replikation benötigt wird und diese eventuell sogar in beiden Richtungen funktionieren soll, würde ich zu einer Datenbank greifen, die so etwas bereits von Haus aus kann

          Comment


          • #6
            Hi,
            <br>
            <br>der MS SQL Server soll "von Haus aus" Replikation unterstützen.
            <br>
            <br>Ggf. Selber Programmieren:
            <br>S = ServerDB
            <br>M1 ... Mn = Mobile DB
            <br>
            <br>S auf Mobilenrechner kopieren.
            <br>Somit wird diese DB zu M1
            <br>Alle Änderungen und Einfügeprozesse in dieser DB protokollieren
            d.h. werden Daten eingefügt, so muß man diesen Datensatz duch ein Flag kennzeichnen, oder diese Aktion in einer Protokolltabelle festhalten. Die Protokolltabelle wäre wohl am besten.
            ID Tabellenname DatensatzID Aktion Zeit
            <br>
            <br>Abgleich mit dem Server:
            <br>alle Protokolldateien S, M1, M2, ... Mn werden durchforstet und die Aktion mit der höchsten Priorität (Zeit) heraus gesucht und ausgeführt (hier sollte man sich ggf. was besseres überlegen, da sonst ja immer nur die letzte aktion ausgeführt wird, was nicht immer gewollt ist).
            <br>Wird nun eine Aktion in S ausgeführt, so muß für neue Datensätze eine neue ID erzeugt werden und diese muß in allen Tabellen die mit dieser Tabelle verknüpft sind und in die nun auch neue Werte geschrieben werden, geändert werden.
            <br>Bsp.:
            <pre>
            alt in M1
            tblNamen
            ID Name Anrede(FK)
            23 Peter 3 (neuer Datensatz)

            tblAnrede
            ID Anrede
            1 Herr
            2 Frau
            3 Es (neuer Datensatz)

            wird übernommen in S

            tblAnrede
            ID Anrede
            1 Herr
            2 Frau
            3 xyxz (wurde zwischenzeitlich auf S erzeugt)
            4 es (neuer Datensatz bekommt neue ID)

            tblNamen
            ID Name Anrede(FK)
            63 Peter 4 (neuer Datensatz bekommt neue ID)
            (aber viel wichtiger, aus anrede = 3 wird anrede = 4
            </pre>
            <br>
            <br>Wie man sieht ist noch wichtig, in welcher Reihenfolge die Werte abgeglichen werden.
            <br>
            <br>mfg
            <br>P

            Comment

            Working...
            X