Du kannst ein ORM-Framework wie Hibernate nur sehr schlecht mit einer reinen JDBC Verbindung vergleichen. Grundsätzlich nimmst Du Geschwindigkeitseinbußen für die ganze Bequemlichkeit in Kauf: Hibernate muss Entities auflösen, den Cache verwalten, Objekte erzeugen und (je nach Einstellung) via Reflection befüllen usw. Du musst halt immer beachten, dass ein ORM-Framework on top einer JDBC Verbindung arbeitet, also immer Mehraufwand hat. Im Gegenzug verwendet Hibernate aber auch viele Techniken, die einen Performancegewinn bringen können - z.B. die Caches. Viele Änderungen, Mehrfachanfragen etc. landen erst gar nicht bei der Datenbank. Dein Test hat das Problem, welches viele Micro-Benchmarks teilen: Er ist wenig aussagekräftig. Die Performance Deines Testlaufen hängen von der Art ab, wie Du die Queries formulierst, ob du mit oder ohne Lazy-Loading arbeitest, wie Dein Anwendungsszenario ist (lädst Du viel nach oder wenig? gibt es viele Cache-Treffer oder nicht? ...), ob die Caches gefüllt sind und was nicht alles. Du selbst hast die Hibernate-Konfiguration erwähnt. Hier ist eine Menge möglich, was stark von Deinem Szenario abhängt, bsp. die Größe Deines Thread-Pools, der verwendete Cache-Algorithmus ..
Generell gilt: Hibernate ist nicht für Batch-Processing ausgelegt und knickt hier schnell in der Performance (Speicher und Geschwindigkeit) ein. Ein OR-Mapper ist aber auch nicht für solch einen Fall konzipiert (und trotzdem kann man hier vieles dafür optimieren: Cache abschalten, StatelessSession verwenden..). Wenn Du also ein gewöhnliches Lastszenarion hast, würde ich immer raten, eine saubere Implementierung mit Hibernate auf Basis von Standard-Einstellungen zu entwickeln und erst dann Gedanken an die Performance zu verschwenden, wenn Du Indikatoren für Probleme hast. Du kennst sicher den Spruch "Don't fix what is not broken" auch bekannt als "premature optimization".
|