Beste Weg, damit umzugehen Hibernate-Sessions in einem geschichteten Spring MVC Web-Anwendung
Wenn wir eine web-Anwendung, die hat
- heavy UI (Spring MVC + JQuery mit JSON)
- Hibernate mit JPA-Annotationen wird die Domäne Modell
- verlängern Frühjahr-vorausgesetzt, DAO-code, der DAO-Schicht
- JBOSS als app-server mit Oracle als backend
- Datasource (JNDI) connection pooling (Nicht XA-eher Lokale Datenquelle)
- hat auch Zugriff auf mehrere Datenquellen (Umgang mit mehreren DB)
Behaviorally, viele Daten abrufen (70%) und die update-Daten 30%
Was wäre der best practices für die folgenden, um effektiv zu verbrauchen, DB-verbindungen und auch zu sehen, dass es nicht viel Leckage an der Verbindung nutzen?
- wäre es besser, entscheiden Sie sich für Hibernate template-basierte DAOs?
- Welche Art von Transaktion-manager würde vorschlagen-können und sollen wir gehen, für die AOP-basierte Transaktion managementWhere
- wo zu instanziieren Sitzung und und wo schließen die Sitzungen, um effektiv zu verbrauchen verbindungen von Verbindungs-pooling.
- Es ist wahr, dass wir brauchen, um Transaktionen von Service-Schicht, aber was passiert mit sessions würde Sie warten, für längere Zeit (wir sind nicht mit jedem opensessioninviewFilter)
- die Schicht ist besser zu handhaben, die checked exceptions (business Ausnahmen) und runtime-exceptions.
Sorry für diese Wesen, etwas längere Frage, aber ich sehe, dass dieses Wesen eine gemeinsame Abfrage und ich versuchte Sie konsolidieren. Schätzen Ihre Geduld und Beratung. Vielen Dank für Ihre Hilfe.
- Was ist, wenn wir geplant, um Datenbank-Partitionierung( Tabelle Range/Hash-partition) am Backend. Funktioniert Hibernate (oder Scherben? Noch nicht in die Produktion!) Unterstützung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das klingt wie eine ziemlich typische Spring/Hibernate-Anwendung, so würde ich empfehlen, die folgenden aktuellen best practices, die ich vor kurzem beschrieben eine andere Antwort. Speziell:
Darüber hinaus verwenden Sie ein connection pool, offensichtlich. Apache Commons DBCP ist eine gute Wahl. "Nicht viel Leckage in der Verbindung nutzen" ist nicht genug. Sie haben null Zusammenhang Leckage. Je nach Feder zur Verwaltung Ihrer Ressourcen helfen, dies sicherzustellen. Wie für jede andere performance-Probleme, versuchen Sie nicht, zu optimieren vorzeitig. Warten Sie, bis Sie sehen, wo Ihre Problemzonen sind, und dann herauszufinden, der beste Weg, um zu lösen jedes einzeln. Seit Ihrer Engpässe, wird am ehesten im Zusammenhang mit der Datenbank, check-out die performance Kapitel der Hibernate-Referenz um eine Idee zu bekommen, was Sie sind gegen. Es deckt die wichtigsten Konzepte von Zwischenspeichern und abrufen von Strategien.
A single session per request allows for most efficient first-level caching, but can cause side effects, for example on saveOrUpdate or when continuing after a rolled-back transaction.
wie für Nebenwirkungen, die ich nicht verstehe, was sind die Probleme?EntityManager
direkt in Ihrem DAOs. Sicher sein, nicht, um Sie zu markieren als Erweiterte<tx:annotation-driven />
und@Transactional
- nur auf der service-Ebene@Transactional(readOnly=true)
in den Fällen, wenn es nur Daten abrufenOpenSessionInView
und faul Sammlungen. Dies ist subjektiv, aber meiner Meinung nach sind alle Objekte, die aus dem service-layer initialisiert werden müssen. Für kleine Sammlungen (für ex. Liste der Funktionen) Sie können gespannt Sammlungen. Für größere Sammlungen verwenden, HQL-Abfragen.entityManager.unwrap(Session.class)