Ankündigung

Einklappen
Keine Ankündigung bisher.

Data Mapper mit Identity Map

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Data Mapper mit Identity Map

    Hallo,

    man verwendet ja oft in einem Data Mapper eine Identity Map um bereits geladene Objekte aus der Datenbank zu speichern und bei erneutem Abrufen wieder aus der Map zu laden. Doch über die Finder kann die Identity Map im schlimmsten Fall ja alle Objekte aus einer Tabelle enthalten. Bei einer Tabelle mit tausenden Einträgen wäre das nicht so optimal. Wie soll man hier handeln?

    Außerdem frage ich mich ob eine Identity Map in einem Data Mapper geeignet ist für Multi-User-Systeme.

    Beispiel:
    Ich lade eine Person über den Finder findById aus der Datenbank. Diese wird dann auch in der Identity Map abgelegt. Ich verändere nun den Benutzer und speichere ihn über den Data Mapper wieder in Datenbank. Das veränderte Objekt wird in der Identity Map abgegelegt und damit aktualisiert. Seit ich die Person per findById ermittelt und in der Identity Map abgelegt habe, bekomme ich ja keine Aktualisierung mehr von der Datenbank, d.h. ein andere Benutzer könnte die Person geändert haben. Die Veränderung bekomme ich ja so nicht mit. Macht die Identity Map daher Sinn oder sollte man diese hier nicht verwenden, bzw. was sollte man in einem solchen Fall tun?

    Bin gespannt auf euere Antworten
    Gruß S. Brosch


  • #2
    Hallöchen,

    generell bin ich der Meinung, dass beide Fragen zu allgemein gehalten sind um sie konkret beantworten zu können. Wie du auf die genannten Probleme reagierst hängt maßgeblich von den Anforderungen deiner Anwendung ab.

    Zitat von sbrosch Beitrag anzeigen
    man verwendet ja oft in einem Data Mapper eine Identity Map um bereits geladene Objekte aus der Datenbank zu speichern und bei erneutem Abrufen wieder aus der Map zu laden. Doch über die Finder kann die Identity Map im schlimmsten Fall ja alle Objekte aus einer Tabelle enthalten. Bei einer Tabelle mit tausenden Einträgen wäre das nicht so optimal. Wie soll man hier handeln?
    Es liegt in der Natur des Konzepts, dass die Verwendung einer Identity-Map zusätzlichen Speicherverbrauch verursacht. Im Normalfall ist das auch ok, da es in den seltesten Fällen tatsächlich notwendig ist, tausende Datensätze zeitgleich in den Speicher zu laden. In solchen Fällen sollte man den Object-Cache natürlich regelmäßig leeren und immer nur verträgliche Mengen in den Speicher laden. Doctrine macht es vor:

    - Doctrine - Batch Processing

    Zitat von sbrosch Beitrag anzeigen
    Außerdem frage ich mich ob eine Identity Map in einem Data Mapper geeignet ist für Multi-User-Systeme.

    Beispiel:
    Ich lade eine Person über den Finder findById aus der Datenbank. Diese wird dann auch in der Identity Map abgelegt. Ich verändere nun den Benutzer und speichere ihn über den Data Mapper wieder in Datenbank. Das veränderte Objekt wird in der Identity Map abgegelegt und damit aktualisiert. Seit ich die Person per findById ermittelt und in der Identity Map abgelegt habe, bekomme ich ja keine Aktualisierung mehr von der Datenbank, d.h. ein andere Benutzer könnte die Person geändert haben. Die Veränderung bekomme ich ja so nicht mit. Macht die Identity Map daher Sinn oder sollte man diese hier nicht verwenden, bzw. was sollte man in einem solchen Fall tun?
    Auch für dieses Problem gibt es etliche Lösungswege. Das ist sicherlich einen Blick wert:

    - Doctrine - Transactions and Concurrency

    Viele Grüße,
    lotti

    Kommentar


    • #3
      Evtl. ist hier ein LRU Cache angebracht. Aber ich würde sowas erst optimieren, wenn ich konkrete Daten hätte. Dann das Bottleneck rausfinden, Lösungen suchen & implementieren. Aber es gibt halt immer Vor- & Nachteile :-/
      Neu bei PHP, lerne aktuell OOP

      Kommentar

      Lädt...
      X