Frank Björn: Wie bekommt ein Objekt Änderung eines andern Objektes mit?

Hallo,

folgendes Szenario:

public class KundenVerwaltung {

private int kundenID;  
private String name = null;  
private String ort = null;  
  
public KundenVerwaltung(int kundenID) {  
	  
	this.kundenID = kundenID;  
	getKundenDaten();  
	  
}  
  
private void getKundenDaten() {  
	  
	this.name = DBAnwendung.getNameAusDatenbank(this.kundenID);  
	this.ort = DBAnwendung.getOrtAusDatenbank(this.kundenID);  
	  
}  
  
  
public void changeKundenOrt(String neuerOrt) {  
	this.ort = neuerOrt;  
	 DBAnwendung.setOrtInDatenbank(this.ort);  
}  
  
  
public String getKundenOrt() {  
	  
	return this.ort;  
}  

}

Sachbearbeiter A erzeugt in seinem Programm KundeBearbeitung ein neues Objekt KundenVerwaltung meinKunde = new KundenVerwaltung(1001), Sachbearbeiter B erzeug getrennt davon auch ein neues Objekt mit derselben kundenID. A ändert den Ort, die Änderung wird auch in eine Datenbank geschrieben. B bekommt davon ja nichts mit... er müsste doch wohl erst wieder aus der Datenbank lesen? Wäre der Ort eine statische Variable, würde die Änderung für alle KundenVerwaltungsobjekte gelten, das ist ja auch nicht der Sinn! Wie kann mal also Änderungen für alle aktuellen KundenVerwaltungsObjekte "bekannt machen" die mit der selben kundenID erzeugt worden sind?

Danke und viele Grüße
Frank

  1. Moin Moin!

    Sachbearbeiter A erzeugt in seinem Programm KundeBearbeitung ein neues Objekt KundenVerwaltung meinKunde = new KundenVerwaltung(1001), Sachbearbeiter B erzeug getrennt davon auch ein neues Objekt mit derselben kundenID.

    Falscher Ansatz. Sorge dafür, dass die IDs eindeutig über Raum und Zeit sind. Benutze einen zentralen ID-Generator oder beziehe lokale Teile in die ID ein.

    Ansätze: Sequence oder Auto-Increment in einem RDBMS, UUIDs.

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
    1. Moin,

      die Id ist schon eindeutig. Aber es kann ja nicht der Sinn eines Objektes sein, dass ich bei jeder Anfrage (nach dem Ort in meinem Beispiel) zur Datenbank renne und nachschaue, ob es eine Änderung gibt... wozu brauche ich das Objekt dann noch, da kann ich ja gleich den direkten Weg gehen und mir nur die aktuelle ID merken?!

      Viele Grüße
      FB

      Moin Moin!

      »» Sachbearbeiter A erzeugt in seinem Programm KundeBearbeitung ein neues Objekt KundenVerwaltung meinKunde = new KundenVerwaltung(1001), Sachbearbeiter B erzeug getrennt davon auch ein neues Objekt mit derselben kundenID.

      Falscher Ansatz. Sorge dafür, dass die IDs eindeutig über Raum und Zeit sind. Benutze einen zentralen ID-Generator oder beziehe lokale Teile in die ID ein.

      Ansätze: Sequence oder Auto-Increment in einem RDBMS, UUIDs.

      Alexander

  2. Mit der Beantwortung dieser Frage haben Unternehmen wie SAP und Oracle viel Geld verdient.

    Gruß, LX

    --
    RFC 1925, Satz 1: Es muss funktionieren.
    1. Mit der Beantwortung dieser Frage haben Unternehmen wie SAP und Oracle viel Geld verdient.

      Gruß, LX

      Gut, dann weiß ich wenigstens, dass es keine dumme Frage war... ;-)

    2. Hello,

      Mit der Beantwortung dieser Frage haben Unternehmen wie SAP und Oracle viel Geld verdient.

      Dabei haben Unternehmen, wie BTrieve das schon 1980 gelöst gehabt und auch Herr Holerit hatte 1920 schon Maßnahmen dafür vorgesehen in seinen Lochkartenlesern.

      Liebe Grüße aus Syburg

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
  3. echo $begrüßung;

    Wenn es Objekte wären, dann könnte das Observer-Pattern helfen.

    A ändert den Ort, die Änderung wird auch in eine Datenbank geschrieben. B bekommt davon ja nichts mit... er müsste doch wohl erst wieder aus der Datenbank lesen?

    Du hast hier aber letzlich keine Objekte sondern Datensätze. Und solange das DBMS nicht einen Mechanismus anbietet, an den sich Andere ankoppeln können, um über Änderungen informiert zu werden, hast du schlechte Karten. Du könntest einen Service davorschalten, über den alls DBMS-Handlungen gehen müssen und der für diese Informationsweitergabe sorgt. Wenn es dir aber nur um Kollisionsvermeidung beim quasi gleichzeitigen Ändern geht, dann gibt es diverse Ansätze. Einer wäre eine Versionsnummer im Datensatz, die bei Änderungen hochgezählt wird. Eine Änderung muss aber vorher prüfen, ob die Version noch stimmt. Das kann auch als Einschränkung beim Update formuliert werden: WHERE ID=? AND Version=?. Werden damit 0 Datensätze geändert, gab es einen Konflikt. Das Ganze kann man auch ohne Versionsnummer realisieren, dann müssen aber alle Felder und deren ursprünglich ausgelesenen Werte in die Update-Bedingung einfließen.

    echo "$verabschiedung $name";

    1. Ok, dass heißt, ich muss immer nach schauen (wo auch immer, die Daten könnten ja auch in einer XML-Datei gespeichert werden)... der Zugriff bedeutet ja auch Systembelastung, die ich vermeiden möchte bzw. scheint sich mir der Sinn von Objekten nicht ganz zu erschließen. Was ich suche ist so eine Art statische Eigenschaft, aber statisch nur für alle Objekte, die mit der geleichen ID erzeugt wurden!

      Viele Grüße
      FB

      1. echo $begrüßung;

        Ok, dass heißt, ich muss immer nach schauen (wo auch immer, die Daten könnten ja auch in einer XML-Datei gespeichert werden)...

        Das kommt auf das System an. Beim DBMS kannst du auf Verdacht schreiben (eben mit den erwähnten einschränkenden Bedingungen) und den Erfolg auswerten. Die Anzahl der betroffenen Datensätze bekommst du ohne weiteren Aufwand als Ergebnis der Operation geliefert. Bei Dateien wirst du dich wahrscheinlich selbst darum kümmern müssen.

        der Zugriff bedeutet ja auch Systembelastung, die ich vermeiden möchte

        Dann kommen Dateien wohl weniger in Frage. Bei geringer Datenmenge spielt Performance ja keine so große Rolle. Wird die Menge größer, hast du mehr Aufwand und mehr Daten beim Schreiben zu bewegen. (Speziell bei solchen sequenziellen Datenhaltungen wie XML.)

        bzw. scheint sich mir der Sinn von Objekten nicht ganz zu erschließen.

        Objekte arbeiten im Speicher eines einzigen Systems. Die Datenpersistierung findet in einem anderen System statt, da haben die Objekte keine direkte Einflussmöglichkeit, wenn es dorthin nur eine SQL-Schnittstelle gibt.

        echo "$verabschiedung $name";

        1. Hallo,

          mir geht es weniger um die Datenhaltung als um die Aktualität der Informationen in einem Objekt. Um nochmal auf mein Beispiel zu kommen. Sachbearbeiter A und B öffnen getrennt voneinander und zeitgleich Ihre Programme zur KundenVerwaltung und erzeugen jeweils ein Objekt, dass sich auf dieselbe Person bezieht. A ändert nun den Ort, während B das erst mitbekommt, wenn er die Kundendaten neu einliest, ansonsten bekommt er eine falsche Information, wenn er nur die Variable aus dem KundenObjekt abruft. Wäre doch schön, wenn beide Objekte auf demselben Stand wären...

          Viele Grüße
          FB

          1. echo $begrüßung;

            mir geht es weniger um die Datenhaltung [...] die Kundendaten neu einliest

            Keine Datenhaltung? Was denn dann? Woher sollen die Daten denn sonst eingelesen werden als aus einer Datenhaltung?

            Sachbearbeiter A und B öffnen getrennt voneinander und zeitgleich Ihre Programme zur KundenVerwaltung und erzeugen jeweils ein Objekt, dass sich auf dieselbe Person bezieht.

            Dann hast du also schonmal zwei getrennte Systeme, eins bei A und das andere bei B (vermutlich noch mehr, aber das ist für das Prinzip egal). Wie kommuniziert denn das Objekt im System A mit dem im System B? Da brauchst du schonmal ein systemübergreifendes Kommunikationssystem. Wenn du eine "X hat geänderte Daten speichern lassen"-Information sofort oder zeitnah an andere beteiligte Bearbeiter senden willst, muss entweder einer die Datenhaltung überwachen und diese Änderungen kommunizieren oder er sitzt vor der Datenhaltung und kommuniziert wenn bei ihm was vorbeikommt. Wenn du nur eine "Inzwischen hat jemand anderes was geändert"-Information im Moment des Speicherversuch brauchst, ... das hab ich ja schon erklärt.

            Für die Sofortbenachrichtigung brauchst du wie gesagt ein systemübergreifendes Kommunikationssystem, und da ist es im Grunde genommen egal, ob an den Enden Objekte oder anders realisierte Abnehmer sitzen. Wenn du dieses System hast, kannst du dir Gedanken machen, wie das mit deinem anzeigenden Objekt kommuniziert. Beziehungsweise du solltest gleich bei der Auswahl eines Systems darauf achten, wie es in das jetzige Programm integriert werden kann.

            echo "$verabschiedung $name";

  4. Hello,

    die Kunden-ID holen sich die Objekte doch wohl aus einer gemeinsamen Statischen Variablen des Systems, oder? Und die wird beim Zugriff sofort heraufgezählt...

    Liebe Grüße aus Syburg

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hallo,

      wieso die Kunden-ID hochzählen????

      Viele Grüße
      Frank Björn

      1. Hello,

        wieso die Kunden-ID hochzählen????

        Ja, wolltest Du nicht ein neues Kundenobjekt erzeugen?
        Oder wolltest Du ein Objekt mitmeinem vorhandenen Kunden Instantiiren?

        Wenn es um die Synchronisation eigentlich voneinander unabhängiger Prozesse geht, dann geht das nur über Semaphore (Mutex http://de.wikipedia.org/wiki/Mutex).

        Dazu musst Du Dir einen Vorgang (= aufeinander folgende Aktionen, die den Status Quo (Ante) mit dem Status Quo Post verbinden) so genau wie möglich skizzieren.

        In zustandslosen Protokollen ist das natürlich besonders schwer, da man da nicht einfach einen Datensatz zur Bearbeitung sperren kann. Das geht im Prinzip nur durch einen entsprechenden Eintag im Datensatz (oder einer abhängigen Tabelle), der entweder nach einer Weile der Nichtaktivität verfällt oder auf Anforderung gelöscht werden kann.

        Das Ganze nennt sich dann auch "pessimistic Locking" oder "premptive Locking"
        Das wesentliche daran ist, dass die Sperre nicht unbeachtet im System verbleibt, wenn der Besitzer sich "abmeldet" oder einfach nicht wieder kommt.

        Liebe Grüße aus Syburg

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de