Frage

Wir haben 2 Java-Web-Apps sind beide Schreib- / Lese und 3 Standalone-Java-Lese / Schreib-Anwendungen (eine Belastung Fragen per E-Mail, ein Verfahren ein XML-Feed, sendet eine E-Mail an Abonnenten) jede Nutzung Hibernate und teilen Basis einen gemeinsamen Code .

Das Problem, das wir vor kurzem über gekommen sind ist, dass per E-Mail manchmal Fragen geladen Fragen Überschreiben in einen der Web-Anwendungen erstellt. Beachten Sie, das sind getrennte Fragen, die getrennte IDs haben sollte. Wir dachten ursprünglich dies ein Caching-Problem zu sein. Wir haben versucht, aus dem Cache der zweiten Ebene drehen, aber das macht keinen Unterschied.

<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.cache.use_second_level_cache">false</property>

Frage:

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false)
@DocumentId
public Integer getId() {
    return this.id;
}

Wir verwenden MySQL btw.

CREATE TABLE  `question` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  ...
  PRIMARY KEY (`id`),
  ...
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Wir sind nicht explizit öffnen und schließen Sitzungen, sondern lassen wintern sie über Util.getSessionFactory().getCurrentSession() verwalten.

Wir würden lieber nicht Setup ein Clustered 2. Level-Cache, da dies in diesem Stadium schafft eine weitere Ebene der Komplexität und wir sind mehr als zufrieden mit dem Niveau der Leistung, die wir von der App als Ganze erhalten.

So eine Open-Session-in-Sicht ist die Umsetzung Muster in den Web-Anwendungen und manuell die Sitzungen in den eigenständigen Verwaltung apps klingen wie es würde dies beheben?

oder andere Vorschläge / Ideen bitte?

War es hilfreich?

Lösung 2

Stellt sich heraus, dieses Problem wurde gar nicht zu Hibernate zusammen.

Eine der Datenbanktabellen auf dem Staging-Server wurde mit alten Daten gefüllt, die aufgeräumt werden sollen. Dies gab zunächst das Auftreten von ids überschrieben, aber weitere Untersuchungen bewiesen anders!

Nachdem wir die zwielichtigen Daten entfernt, alles war gut.

Andere Tipps

Da alle Fragen-IDs haben, dann gehe ich davon aus, dass alle Fragen aus Ihrer MySQL-Datenbank abgerufen werden.

Unter der Annahme, dass Sie nicht die Fragen als transparente Objekte im Speicher speichern müssen, sondern, dass Sie alle Fragen für jedes Mal, wenn Sie sie präsentieren wählen, ich habe einen einfachen Vorschlag.

Ersetzen Sie den ID-Generator mit einer Sequenz in der Datenbank. (Schließlich wird die ID als Autowert in MySql). Dann wird die Datenbank anstelle der Anwendungen gewährleistet, dass jede Frage eine eindeutige ID wird.

Diese Lösung ist ganz einfach und reduziert die Komplexität. Und es funktioniert nur, wenn Sie alle eingehenden Fragen aus den verschiedenen Quellen in Ihre Datenbank bestehen und sich dann wählen Sie von hier.

Wenn diese Lösung Sie Performance-Probleme gibt, sollten Sie untersuchen, mehr darüber, wie Sie Ihre Hibernate-ID-Generator arbeiten. Hibernate bietet verschiedene Generatoren für verschiedene Szenarien.

Hope diese Hilfe!

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