2009-05-29 6 views
5

Wir haben gerade erst begonnen, Hibernate zu verwenden und sind immer noch daran gewöhnt, wie es funktioniert.Wie erzwinge Hibernate, um Speicher freizugeben, sobald die Sitzung geschlossen ist?

Eines der Dinge, die wir gesehen haben, ist, dass, selbst nachdem alle Sitzungen geschlossen wurden und Referenzen den Gültigkeitsbereich verlassen haben, der Ruhezustand die zuvor verwendeten Datenbankwerte weiterhin im Cache zu halten scheint.

Wir haben Code, der aus einer Reihe von Tabellen in mehreren Durchgängen liest. Da die gesamte Speicherkapazität sehr sparsam ist, werden die späteren Arbeitsschritte langsam zu einem Crawling.

Gibt es eine Möglichkeit, Hibernate zu zwingen, seinen Cache zu löschen?

Ein expliziter Aufruf von System.gc() hilft nicht. (Ja, ich weiß, es ist ein Vorschlag)

Zusätzliche Informationen: Wir haben den Second-Level-Cache explizit deaktiviert.

+3

Ich nehme an, Sie verwenden nicht dann Second-Level-Cache des Hibernate? Welche Strategie verwenden Sie für die Sitzungsverwaltung? "Sitzung pro Thread"? –

+0

Wir verwenden Session-per-Thread, und wir haben explizit den Second-Level-Cache deaktiviert – StudioEvoque

Antwort

10

Sie könnten versuchen, Session.clear aufzurufen, um das Löschen des Cache der ersten Ebene zu erzwingen. Stellen Sie sicher, dass Sie zuerst Session.flush aufrufen, um ausstehende Änderungen in die Datenbank zu schreiben. Wenn das das Problem "behebt", dann vermute ich, dass noch immer ein Verweis auf die Sitzung vorhanden ist, wodurch verhindert wird, dass die Objekte im Cache von der Müllsammlung erfasst werden. Möglicherweise müssen Sie einen Heapspeicherauszug Ihres Programms abrufen, um das Leck aufzuspüren.

+0

Es "repariert" das Problem :) Wie Sie vorgeschlagen haben, überprüfen wir einige unserer "HibernateUtils" erstellt, um zu sehen, wo wir Halten Sie sich an Sitzungsreferenzen. – StudioEvoque

+0

Sie könnten auch in Betracht ziehen, ein Framework wie Spring zu verwenden, um Ihre Hibernate-Sitzungen und -Transaktionen für Sie zu verwalten, falls dies nicht bereits geschehen ist. –

+0

Danke, dieser Vorschlag hat mir geholfen, ein Problem zu beheben, das meine Java-App in den letzten paar Tagen zerstört hat! – mahonya

2

Hibernate hat auch einen optionalen Second-Level-Cache, der im Spiel sein könnte. Ich stimme Rob zu, der einfachste Weg, herauszufinden, ist, was nach dem Ende der Sitzung noch im Speicher ist.

Mein aktuelles Lieblingswerkzeug dafür ist YourKit das ist kommerziell und nicht gerade billig. Früher haben sie eine persönliche Lizenz angeboten, die sehr günstig war ($ 99 IIRC). Ich habe YourKit für genau diese Aufgabe verwendet, wenn Probleme bei der Heap-Nutzung mit Alfresco ECM behoben werden. Es gibt andere Werkzeuge (z. B. CodeGear JGears), die, wie ich verstehe, auch sehr gut funktionieren.

Sie betrachten könnte ein Produkt im Testmodus verwenden - wenn das Ihr Problem findet, kann er seinen Unterhalt verdienen;)

+0

Wenn GC GC nicht hilft, müssen die Objekte noch irgendwo in Ihrem Code verwiesen werden. Ein Profiler mit Speicherleckerkennung ist der schnellste Weg zu einer IMHO-Antwort, da Sie * sehen * den Pfad verursachen werden. Viel Glück! –

Verwandte Themen