2008-11-04 7 views
18

Ich muss Objekte in einer HSQL-In-Memory-Datenbank alle 5 Sekunden mit einer konsistenten Rate von mindestens 8000 Objekten einfügen/aktualisieren.ORM-Lösungen (JPA; Hibernate) vs. JDBC

Ich habe einige Vergleichstests zwischen Spring/Hibernate/JPA und reinem JDBC durchgeführt. Ich habe einen signifikanten Unterschied in der Leistung mit HSQL gefunden. Mit Spring/Hib/JPA, kann ich 3000-4000 meiner 1,5 KB Objekte (mit einer One-Many und einer Many-Many-Beziehung) in 5 Sekunden einfügen, während mit direkten JDBC-Aufrufe kann ich 10.000-12.000 dieser gleichen Objekte einfügen.

Ich kann nicht herausfinden, warum es so eine große Diskrepanz gibt. Ich habe die Spring/Hib/JPA-Einstellungen stark optimiert, um ohne Glück in der Performance zu sein. Ich möchte Spring/Hib/JPA für zukünftige Zwecke, Erweiterbarkeit und weil die Fremdschlüsselbeziehungen (eins-viele und viele-viele) schwierig von Hand zu pflegen sind; aber die Leistungsanforderungen scheinen auf die Verwendung von reinem JDBC hinzuweisen.

Irgendwelche Ideen, warum es so eine große Diskrepanz geben würde?

+2

Sie könnten diese Frage umbenennen, da der Titel die Frage nicht sehr anschaulich macht. –

+0

Was würden Sie vorschlagen? – systemoutprintln

Antwort

15

Wir haben ähnliche Erfahrung im Vergleich von Hibernate mit JDBC im Batch-Modus (Anweisung # executeBatch()). Grundsätzlich scheint Hibernate bei Massenoperationen nicht so gut zu funktionieren. In unserem Fall war die Implementierung von Hibernate auf unserer Produktionshardware schnell genug.

Sie können Ihre Datenbankaufrufe in einem DAO umbrechen, um Ihrer Anwendung eine konsistente Zugriffsmöglichkeit für Ihre Daten zu geben. Implementieren Sie Ihre DAOs dort, wo es Ihnen passt und mit JDBC, wo die Leistungsanforderungen es erfordern.

+1

Haben Sie auch Hib Batch gemacht? In meinen Tests waren Hib-Chargen und JDBC-Charge fast identisch. –

5

Hibernate verwaltet einen Cache der ersten Ebene mit Objekten, die bei der Prüfung auf fehlerhafte Daten sowie als Arbeitseinheit und Identitätskarte verwendet werden können. Dies erhöht den Overhead, insbesondere bei Massenoperationen. Bei Bulk-Vorgängen möchten Sie möglicherweise StatelessSessions untersuchen, die diesen Status nicht beibehalten.

+1

Dokumente können verschoben werden. http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html – JavaRocky

2

All das Mapping ... es kann ein bisschen teuer werden, mit all der arkanen Logik und all der Reflexion und Konsistenzprüfung, die es zu tun hat.

Der Punkt des Mappings ist natürlich nicht die Leistung zu erhöhen. Normalerweise nehmen Sie einen Leistungseinbruch. Aber was Sie in der Leistung verlieren, können Sie (kann) viele Male in Entwicklerproduktivität, Konsistenz, Testbarkeit, Zuverlässigkeit und so viele begehrte Attribute gewinnen. Wenn Sie die zusätzliche Leistung benötigen und nicht auf das Mapping verzichten möchten, fügen Sie normalerweise noch mehr Hardware hinzu.

9

Als Minimum müssen Sie Batch-Einsätze in Hibernate: http://www.hibernate.org/hib_docs/reference/en/html/batch.html Speichert viel Umlaufzeit.

Und wie die Justiz erwähnte, ist das primäre Ziel von Hib nicht die Computerleistung, sondern die Leistung des Entwicklers. Allerdings ist es in der Regel möglich, vergleichbare (nicht gleiche, aber nicht viel schlechtere) Ergebnisse mit JDBC zu erzielen.

+0

Möglicherweise ist die Dokumentation verschoben worden. Versuchen Sie es hier http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html – JavaRocky

+0

Auch dies wird von der Dokumentation erwähnt, aber leicht zu übersehen. Der Batch-Modus wird deaktiviert, wenn Sie Inserts ausführen und mit Entitäten arbeiten, die einen automatisch generierten Primärschlüssel haben. – Pace

5

Verwenden Sie niemals eine Technologie für alle Probleme. Je nach Problem entscheiden, welche Technologie zu verwenden ist. Natürlich ist jpa oder Hibernate langsamer als jdbc. jdbc ist auf einer niedrigeren Ebene als jpa. Auch ein db Professional mit jdbc kann mehr optimierte sql als jpa schreiben. Wenn Sie einen kritischen Punkt angegeben haben, an dem Geschwindigkeit benötigt wird, ist jpa nicht Ihre Wahl.