it-swarm.com.de

Spring JDBCTemplate VS Hibernate in Bezug auf die Leistung

In unserem Projekt müssen wir uns zwischen Spring JDBCTemplate und Hibernate entscheiden. 

Ich möchte wissen, was in Bezug auf Leistung, Implementierung und Design. Besser ist und wie?

35
Amruta

Wenn Sie alles tun, um beide Implementierungen sehr schnell durchzuführen, wird die JDBC-Vorlage wahrscheinlich etwas schneller sein, da sie nicht den Overhead hat, den Hibernate hat. Es wird jedoch wahrscheinlich viel mehr Zeit und Codezeilen für die Implementierung benötigen. 

Der Winterschlaf hat seine Lernkurve, und Sie müssen verstehen, was hinter den Kulissen passiert, wann Projektionen verwendet werden, anstatt Entitäten zurückzugeben -basierte Lösung. 

Ich würde sagen, dass Hibernate in 95% der Fälle schnell genug ist oder sogar schneller als nicht optimierter JDBC-Code. Für die restlichen 5% verbietet nichts, etwas anderes zu verwenden, wie beispielsweise Spring-JDBC. Beide Lösungen schließen sich nicht aus.

46
JB Nizet

Das hängt von Ihrem Projekt ab und davon, wie gut das Hibernate-Modell Ihrer Denkweise entspricht. Geschwindigkeit und Leistung sind irrelevant: Wenn Sie nicht wissen können, wie Hibernate funktioniert, wird Ihr Projekt mit seltsamen Fehlern übersät, die lange dauern, bis sie gefunden und behoben sind.

Beachten Sie auch, dass das Innere von Hibernate in Ihr Modell und Ihre DAOs eindringt. Bemerkenswerte Konfliktpunkte sind normalerweise equals()/hashCode() und das langsame Laden von Sammlungen außerhalb von Transaktionen. Da die Beispiele mit Hibernate so einfach sind und Sie in kurzer Zeit viel erreichen können, kann dies zu der falschen Annahme führen, dass Hibernate einfach ist. Es ist nicht. Hibernate macht viele Annahmen und zwingt Sie, auf eine bestimmte Art zu denken und zu kodieren.

Die Verwendung von JdbcTemplate ist einfacher, da es sich nur um einen sehr dünnen Wrapper um JDBC selbst handelt. Der Preis hier ist, dass Sie Tausende von Zeilen mit wirklich langweiligem Code schreiben werden. Außerdem werden Sie feststellen, dass SQL-Zeichenfolgen wirklich schwer zu verwalten sind. Wenn sich Ihr Datenmodell ändert, müssen Sie Ihre gesamte Codebasis nach allen betroffenen Orten durchsuchen. Es wird nicht hübsch sein.

Für unser eigenes Projekt haben wir uns gegen Hibernate entschieden, weil wir sehr komplexe Datenstrukturen (überarbeitete Baumstrukturen) haben und zur Laufzeit komplexe Suchanfragen erstellen müssen. Stattdessen haben wir unsere eigene DAO-Schicht mit jOOQ geschrieben. jOOQ ist ein dünner Wrapper für JDBC, mit dem Sie SQL mit einem Nice DSL in Java schreiben können:

create.selectFrom(BOOK)
      .where(PUBLISHED_IN.equal(2011))
      .orderBy(TITLE)

Wie Hibernate hat jOOQ einige Regeln, denen Sie folgen sollten, oder Sie werden nicht glücklich sein, aber diese sind viel nachsichtiger.

Als weitere Option sollten Sie sich Spring Data ansehen. Kurz gesagt: Mit Spring Data können Sie Ihre Daten in einem beliebigen Objekt speichern, das einer Datenbank in der Ferne ähnelt. Dies bedeutet, dass Sie Ihr Modell mit Hibernate und einem anderen mit einer NoSQL-Datenbank verwalten können. Oder Sie können einen Teil Ihres Modells bei Bedarf problemlos migrieren.

Eines der Hauptmerkmale ist, dass die DAO Implementation so aussieht:

public interface UserRepository extends Repository<User, Long> {

  List<User> findByEmailAddressAndLastname(String emailAddress, String lastname);
}

Nun fragen Sie sich vielleicht, wo die Implementierung ist, da dies nur eine Schnittstelle mit einer Methodendefinition ist, aber das ist es. Zur Laufzeit generiert Spring Data Code, der diese Methode implementiert. Dies ist möglich, da 99% aller Abfragen, die Sie benötigen, die Form "Abfragetabelle für alle Zeilen haben, in denen Spalte X ... ist", sodass sie diesen Anwendungsfall optimiert haben.

OTOH, wenn Sie bereits wissen, dass Sie zur Laufzeit wirklich komplexe Suchanfragen erstellen, wird Spring Data wahrscheinlich nicht viel helfen.

34
Aaron Digulla

In unserem Projekt verwenden wir sowohl JdbcTemplate als auch Hibernate. Sie müssen DataSource zwischen hibernate und jdbcTemplate freigeben. Wir können die Leistung für beide nach Operationen überprüfen, je nachdem, was besser ist, verwenden wir eine bessere. Meistens verwenden wir den Ruhezustand für normale Vorgänge. Wenn es große Abfragen oder umfangreiche Vorgänge gibt, überprüfen wir die Leistung für jdbc und den Ruhezustand, je nachdem, was wir besser nutzen.

Der gute Punkt ist HibernateTransactionManager funktioniert sowohl für (JdbcTemplate, plain jdbc) als auch für den Ruhezustand.

15

Ist Ihr Datenbankdesign im Ruhezustand? Wenn ja, dann verwenden Sie den Ruhezustand ... Wenn nicht, dann möchten Sie möglicherweise den Umstand vermeiden. Jdbctemplate hat viele Vorteile und es gibt Möglichkeiten, um sicherzustellen, dass Ihre SQL-Abfragen einfach gepflegt werden. Verwenden Sie eine Klasse, die alle enthält, oder lesen Sie sie aus einer Datei usw. Wenn Spalten aktualisiert werden müssen, gibt es eine Möglichkeit, Standard-Jdbc zu verwenden, um Resultset-Metadaten abzurufen, mit denen Sie Spaltennamen abrufen können. Dies kann komplex sein, aber ein interessanter Weg, um ein Problem zu lösen. Hibernate ist ein großartiges Werkzeug, aber komplexe Datenmodelle machen es wirklich schwierig.

0
Pasha Utt