Frage

Gibt es eine brauchbare Alternative zu Ruhezustand? Vorzugsweise etwas, dass die Basis sich nicht auf PPV.

Unser Problem ist, dass wir einen Komplex bauen System (wie in, viele Objekte aufeinander verweisen) Stateful RIA. Es scheint, als Hibernate ausgelegt ist vor allem auf einmalige Anwendungen eingesetzt werden -. JSF und dergleichen

Das Problem ist vor allem, dass der verzögertes Laden. Da es mehrere HTTP-Anfragen zwischen der Initialisierung sein kann und faul Sammlungen tatsächlich geladen wird, ist eine Sitzung pro Transaktion in Frage. Ein langlebiges Sitzung (eine pro Anwendung) nicht gut funktioniert entweder, weil, sobald eine Transaktion einen Haken schlägt und löst eine Ausnahme wird die gesamte Sitzung, so dass die faul geladenen Objekte brechen für ungültig erklärt. Dann gibt es alle möglichen Dinge, die einfach nicht für uns arbeiten (wie implizite Daten persistierende von Daten von außerhalb eines initialisierten Transaktion).

Meine arme Erklärungen beiseite lässt, ist unter dem Strich, dass Hibernate Magie tut uns nicht gefällt. Es scheint, wie TopLink nicht besser ist, ist es auch auf der EJB geschrieben werden.

Also, eine stateless Persistenz-Schicht (oder sogar hell genug objektorientierte Datenbank-Abstraktionsschicht) ist es, was wir brauchen die meisten.

Alle Gedanken, oder bin ich etwas fragen, das gar nicht existiert?

Edit: Es tut mir leid für meine zweideutige Terminologie, und danke Ihnen allen für Ihre Korrekturen und aufschlussreiche Antworten. Diejenigen, die mich korrigiert, Sie sind alle richtig, ich meinte JPA, EJB nicht.

War es hilfreich?

Lösung

Wie bereits erwähnt, JPA <> EJB, sind sie nicht einmal verwandt. EJB 3 geschieht PPV zu nutzen, aber das ist es. Wir haben ein paar Sachen JPA verwenden, die nicht einmal in der Nähe läuft EJB kommt.

Ihr Problem ist nicht die Technologie, es ist Ihr Design.

Oder soll ich sagen, Ihr Design ist nicht einfach passen auf so ziemlich jeden modernen Rahmen.

Im Einzelnen Sie versuchen, Transaktionen am Leben über mehrere HTTP-Anfragen zu halten.

Natürlich sind die meisten jeder gemeinsame Idiom ist, dass jede Anforderung an sich eine oder mehrere Transaktionen, anstatt jede Anforderung einen Teil einer größeren Transaktion zu sein.

Es ist auch offensichtlich, Verwirrung, wenn Sie den Begriff „stateless“ verwendet und „Transaktion“ in der gleichen Diskussion, wie Transaktionen inhärent Stateful sind.

Ihr großes Problem ist Ihre Transaktionen manuell einfach zu verwalten.

Wenn Sie Transaktion stattfindet über mehrere HTTP-Anfragen, und die HTTP-Anfragen passieren „sehr Quicky“ zu laufen, direkt hintereinander, dann sollten Sie nicht wirklich echtes Problem werden muss, sparen, die Sie haben, um sicherzustellen, dass Ihre HTTP-Anforderungen sind die gleichen DB-Verbindung, um mit Hilfe der Datenbanken Transaktionsmöglichkeiten zu nutzen.

Das heißt, in einfachen Worten, Sie eine Verbindung mit dem DB zu bekommen, stopfen es in der Sitzung, und stellen Sie sicher, dass für die Dauer der Transaktion, die alle Ihrer HTTP-Anfragen durchlaufen nicht nur die gleiche Sitzung, aber in so, dass die tatsächliche Verbindung noch gültig ist. Genauer gesagt, ich glaube nicht, dass es eine aus dem Regal JDBC-Verbindung ist, die tatsächlich Failover oder Last überleben werden von einer Maschine zum anderen ausgleicht.

So einfach, wenn Sie DB-Transaktionen verwenden möchten, müssen Sie sicherstellen, dass Ihr die gleiche DB-Verbindung verwendet wird.

Nun, wenn Sie Ihre lange laufende Transaktion hat „Benutzer-Interaktionen“ in ihn, das heißt Sie die DB-Transaktion starten und für den Benutzer warten „etwas zu tun“, dann, ganz einfach, ist, dass das Design alles falsch. Sie wollen nicht das tun, so lange Transaktionen lebten, vor allem in interaktiven Umgebungen sind einfach nur schlecht. Wie "Crossing the Streams" Bad. Tun Sie es nicht. Batch-Transaktionen sind unterschiedlich, aber interaktives langlebiges Transaktion Bad.

Sie möchten Ihre interaktiven Transaktionen zu halten, wie kurzlebig wie praktisch.

Nun, wenn Sie nicht sicherstellen können Sie in der Lage sein werden, die gleiche DB-Verbindung für Ihre Transaktion zu verwenden, dann, Glückwünsche, erhalten Sie Ihre eigenen Transaktionen zu implementieren. Das bedeutet, dass Sie Ihr System und Ihre Daten zu entwerfen bekommen fließen, als ob Sie keine Transaktionsfähigkeit auf dem Back-End haben.

Das bedeutet im Wesentlichen, dass Sie mit Ihrem eigenen Mechanismus müssen kommen bis zu „begehen“ Ihren Daten.

Ein guter Weg, dies zu tun wäre, wo Sie Ihre Daten inkrementell zu einem einzigen „Transaktion“ Dokument aufbauen, dann füttern, das Dokument zu einer „Speicher“ Routine, die viel von der eigentlichen Arbeit tut. Wie könnten Sie eine Zeile in der Datenbank speichern und markieren sie als „nicht gespeichert“. Sie tun das mit allen Ihren Reihen, und ruft schließlich eine Routine, die Sie gerade gespeichert durch alle Daten ausgeführt wird, und markiert mich alle wie in einem einzigen Transaktion Mini-Batch-Prozess „gerettet“.

Inzwischen alle Ihre anderen SQL „ignoriert“ Daten, die nicht „gerettet“ wird. Throw in einigen Zeitstempel und einen Reaper Prozess Fänger haben (wenn Sie wirklich stören wollen - es auch tatsächlich billiger sein kann, nur um tote Zeilen in der DB verlassen, ist abhängig von Volumen), diese toten „nicht gespeicherte“ Zeilen, da diese "uncomitted" -Transaktionen.

Es ist nicht so schlimm, wie es klingt. Wenn Sie wirklich eine zustandslosen Umgebung wollen, das ist, wie es klingt für mich, dann müssen Sie etwas wie dies tun.

Geist, in all dies die Persistenz Tech hat wirklich nichts damit zu tun. Das Problem ist, wie Sie Ihre Transaktionen zu verwenden, anstatt die tech so viel.

Andere Tipps

Wenn Sie nach dem anderen JPA-Provider sind (Hibernate ist eine davon) nehmen dann einen Blick auf Eclipse . Es ist weit mehr voll funktions als die JPA 1.0 Referenzimplementierung von TopLink Haves. In der Tat wird die Eclipse JPA 2.0 Referenzimplementierung mit Glassfish V3 Schluss versandt werden.

JPA ist gut, weil Sie es sowohl innerhalb als auch außerhalb eines Behälters verwenden können. Ich habe Swing-Kunden geschrieben, die JPA mit guter Wirkung verwendet werden. Es muss nicht die gleiche Stigma und XML Gepäck, das 2.0 / 2.1 EJB kam mit.

Wenn Sie nach einer noch leichteren Gewicht Lösung sind dann suchen Sie nicht weiter als ibatis , die mich für meine Persistenz-Technologie der Wahl für die Java-Plattform zu sein. Es ist leicht, setzt auf SQL (es ist erstaunlich, wie viel Zeit ORM-Nutzer verbringen versuchen, ihre ORM produzieren gute SQL zu machen) und macht 90-95% dessen, was JPA tut (einschließlich verzögertes Laden der verbundenen Einrichtungen, wenn Sie möchten).

Nur ein paar Punkte zu beheben:

  • JPA ist die peristence Schicht von EJB, nicht auf EJB gebaut;
  • Jede anständige JPA-Provider eine ganze Menge Caching hat los und es kann es schwierig sein, auf Figur alle aus (dies wäre ein gutes Beispiel dafür, „Warum ist Einfachheit so komplex?“). Es sei denn, Sie etwas tun, haben Sie nicht indicatd, Ausnahmen sollte kein Problem für die verwalteten Objekte sein. Runtime Ausnahmen Rollback der Regel Transaktionen (wenn Sie Spring-Transaktionsmanagement verwenden und wer tut das nicht?). Der Anbieter wird im Cache gespeicherte Kopien der geladenen oder beharrten Objekte beizubehalten. Dies kann problematisch sein, wenn Sie außerhalb des Unternehmens-Manager (erfordert einen expliziten Cache-Flush oder die Verwendung von EntityManager.refresh()) aktualisiert werden soll.

Ich glaube, Sie haben einen Blick sollte unter Apache Cayenne , die eine sehr gute Alternative zu „groß“ ist Frameworks. Mit seinen anständigen Modellierer wird die Lernkurve durch eine gute Dokumentation zu verkürzen.

Ich habe unter SimpleORM letztes Jahr und war sehr beeindruckt von seinem leichten No-Magie-Design . Nun scheint es eine Version 3 zu sein, aber ich habe keine Erfahrung mit, dass ein.

Ebean ORM ( http://www.avaje.org )

Es ist ein einfacher intuitiver ORM zu verwenden.

  • Verwendet JPA Annotationen für Mapping (@Entity, @OneToMany usw.)
  • sitzungs API - Keine Hibernate Session oder JPA Entity-Manager
  • Lazy Loading nur funktioniert
  • Teilobjekt Unterstützung für mehr Leistung
  • Automatische Abfrage Abstimmung über "Autofetch"
  • Feder Integration
  • Große Abfrage Unterstützung
  • Große Unterstützung für Batch-Verarbeitung
  • Hintergrund Abrufen
  • DDL-Generation
  • Sie können roh SQL verwenden, wenn Sie (so gut wie Ibatis) wie
  • LGPL Lizenz

  • Rob.

BEA Kodo (formerlly Solarmetric Kodo) ist eine weitere Alternative. Es unterstützt JPA, JDO und EJ3. Es ist in hohem Maße konfigurierbar und kann agressive Prefetching, Abnehmen / Anbringen von Objekten unterstützen, etc.

Obwohl, von dem, was Sie beschrieben haben, sollte Toplink Lage sein, Ihre Probleme zu behandeln. Meistens klingt es wie Sie Objekte aus der Persistenz-Schicht in der Lage sein müssen, um ein zu Anbringen / Lösen als Anfragen beginnen und enden.

Nur als Referenz, warum die OP-Design ist sein größtes Problem: spanning Transaktionen über mehrere Benutzeranforderungen bedeutet, dass Sie so viele offene Transaktionen zu einem bestimmten Zeitpunkt haben können, da Nutzer auf Ihre App verbunden sind - eine Transaktion hält die Verbindung besetzt, bis es ist verpflichtet, / zurückgerollt. Mit tausend Benutzer gleichzeitig verbunden sind, können diese potenziell Tausende von Verbindungen bedeuten. Die meisten Datenbanken tun dies nicht unterstützen.

Weder Hibernate noch Toplink (Eclipselink) auf EJB basiert, sind sie beide POJO persistancy Frameworks (ORM).

ich mit der vorherige Antwort einig: iBatis ist eine gute Alternative zu ORM-Frameworks. Die volle Kontrolle über SQL, mit einem guten Caching-Mechanismus

Eine andere Option ist, Drehmoment, ich sage nicht, es ist besser als eine der Optionen oben, aber nur erwähnt, dass es eine weitere Option ist, zu betrachten. Es wird jetzt immer ziemlich alt, aber möglicherweise einige Ihrer Anforderungen passen.

Drehmoment

Als ich mich war Suche nach einem Ersatz Hibernate Ich stolperte über Datanucleus Access Platform , die eine Apache2-lizenzierten ORM. Es ist nicht nur ORM wie es Ausdauer und den Abruf von Daten ist auch in anderen Datenquellen als RDBMS, wie LDAP, DB4O und XML. Ich habe keine Nutzung Erfahrung haben, aber es sieht interessant aus.

Betrachten Sie Ihr Paradigma vollständig mit so etwas wie tox zu brechen. Wenn Sie Java-Klassen benötigen könnten Sie das XML-Ergebnis in JDOM .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top