2008-12-02 10 views
6

Ich habe einen täglichen Batch-Prozess, bei dem eine große Anzahl von Datensätzen ausgewählt und eine Datei formatiert wird, die an ein externes System gesendet werden soll. Ich muss diese Datensätze auch als gesendet markieren, damit sie morgen nicht wieder übertragen werden.Ist Hibernate gut für die Stapelverarbeitung? Was ist mit der Speichernutzung?

In meiner naiven JDBC-Art würde ich eine Anweisung vorbereiten und ausführen und dann mit der Schleife durch das Recordset beginnen. Da ich nur durch das Recordset gehe, ist es für meinen Anwendungsserver nicht notwendig, das gesamte Resultset gleichzeitig im Speicher zu halten. Gruppen von Datensätzen können über den Datenbankserver geleitet werden.

Nun sagen wir, ich verwende Hibernate. Will ich nicht mit einer Menge von Objekten enden, die das gesamte Ergebnis im Speicher gleichzeitig repräsentieren?

Antwort

5

Hibernate iteriert auch über die Ergebnismenge, sodass nur eine Zeile im Speicher verbleibt. Dies ist der Standardwert. Wenn es gierig lädt, musst du es so sagen.

Gründe Hibernate zu verwenden:

  • „Jemand“ war „kreativ“ mit den Spaltennamen (PRXFC0315.XXFZZCC12)
  • Das DB-Design noch im Fluss ist und/oder Sie wollen einen Ort, wo Spalt Namen werden Java zugeordnet.
  • Sie verwenden Hibernate sowieso
  • Sie haben komplexe Abfragen und Sie sind in SQL

Gründe nicht Hibernate nicht fließend zu verwenden:

  • Der Rest Ihrer App pure JDBC
  • Sie benötigen keine Leistung von Hibernate
  • Sie haben komplexe Abfragen und Sie sprechen fließend SQL
  • Sie benötigen eine bestimmte Funktion Ihrer DB der SQL ausführen
1

Meiner Meinung nach machen würde ich NICHT Verwendung Hibernate, da es macht Ihre Anwendung eine ganze Menge größer und weniger wartbar und Sie nicht wirklich haben die Möglichkeit, die generierten sql-Skripte schnell zu optimieren. Darüber hinaus können Sie alle SQL-Funktionen verwenden, die die JDBC-Bridge unterstützt und sind nicht auf die Hibernate-Funktionalität beschränkt. Eine andere Sache ist, dass Sie auch die Einschränkungen haben, die mit jeder Ebene des Legacy-Codes einhergehen.

Aber am Ende ist es eine philosophische Frage, und Sie sollten es so machen, wie es Ihnen am besten passt.

0

Wenn es mögliche Leistungsprobleme gibt, dann bleiben Sie mit dem JDBC-Code.

Es gibt eine Reihe von bekannten reinen SQL-Optimierungen, die , die in Hibernate sehr schwierig sein würden.

Wählen Sie nur die Spalten aus, die Sie verwenden! (Kein "Select *" Zeug).

Halten Sie die SQl so einfach wie möglich. z.B. Fügen Sie keine kleinen Referenztabellen wie Währungscodes in den Join ein. Laden Sie stattdessen die Währungstabelle in den Speicher und lösen Sie Währungsbeschreibungen mit einer Programmsuche.

Abhängig von der kleinen Neuordnung der SQL-Datenbank, in der Prädikate einen großen Einfluss auf die Leistung haben können.

Wenn Sie aktualisieren/einfügen nur alle 100 bis 1000 Updates zu committen. Bete nicht jede Arbeitseinheit, aber behalte einen Zähler, damit du weniger oft commitest.

Nutzen Sie die Aggregatfunktionen Ihrer Datenbank. Wenn Sie Summen nach DEPT-Code wollen, dann tun Sie es in der SQL mit "SUM (Betrag) ... GROUP BY DEPT".

+0

Ändern der Projektion ist einfach in Hibernate, können Sie wieder Liste Modellierung eines relationalen Ergebnisraster, oder Hibernate instanziieren ein bestimmtes Objekt für Sie mit nativen SQL oder HQL. Aggregatfunktionen und GROUP BY sind auch in der Kriterien-API und in HQL verfügbar. –

2

Hibernate wie jedes ORM-Framework ist für die Entwicklung und Wartung von Systemen gedacht, die auf objektorientiertem Programmierprinzip basieren. Die meisten Datenbanken sind jedoch relational und nicht objektorientiert, so dass ORM immer ein Kompromiss zwischen praktischer OOP-Programmierung und optimiertem/effektivem DB-Zugriff ist.

Ich würde ORM nicht für bestimmte isolierte Aufgaben verwenden, sondern eher als allgemeine architektonische Wahl für die Persistenzschicht der Anwendung.

3

Hibernate bietet einige Möglichkeiten, um die Sitzung klein zu halten.

Sie können Query.scroll(), Criteria.scroll() für JDBC-ähnliches Scrollen verwenden. Sie können Session.evict (Object entity) verwenden, um Entitäten aus der Sitzung zu entfernen. Sie können eine StatelessSession verwenden, um die Überprüfung von Dirty zu unterdrücken. Und es gibt einige weitere Leistungsoptimierungen, siehe die Hibernate-Dokumentation.