Leistungstests zwischen QueryDSL SQL und JDBCTemplate

8

Ich versuche, "die höheren ups" zu überzeugen, querydsl sql für unsere Beständigkeit zu verwenden. Aber sie bevorzugen Frühling jdbctemplate, mit dem Grund, dass es die beste rohe Leistung gibt.

Leistung ist unser Hauptanliegen natürlich. Deshalb ist JPA überhaupt keine Option. Ist der SQL-Overhead von QueryDSL zu hoch, um ihn von unseren Optionen abzukoppeln?

Ich wollte wissen, ob es "kürzlich" durchgeführte Leistungstests gibt, um zu zeigen, wie querydsl sql mit jdbctemplate und jpa läuft.

Ich bin auf dieses gestoßen. Ich möchte die relative Leistung von querydsl sql im Vergleich zu jdbctemplate und einer jpa-Implementierung kennen.

    
Ameen.M 30.06.2016, 12:33
quelle

3 Antworten

11

Ich habe einige Performance-Tests durchgeführt, um den Overhead / Performance-Vergleich zwischen querydsl und jdbctemplate zu vergleichen.

Hier ist, was ich getan habe  1. Erstellt ein Spring Boot-Projekt, das querydsl und jdbctemplate verwendet  2. Erstellt 2 Endpunkte, 1 für die Verwendung von querydsl und eine weitere für jdbctemplate.
 3. Die querydsl-Konfiguration verwendet die automatisch konfigurierte Datenquelle des Spring-Boot, um ihre SQLQueryFactory zu konfigurieren.
 4. JdbcTemplate wird auch automatisch mit derselben automatisch konfigurierten Datenquelle konfiguriert.
 5. Es gibt 2 Implementierungen einer ähnlichen Abfrage im Repository, eine verwendet querydsl und die andere verwendet jdbctemplate. Die Abfrage ist relativ komplex und besteht aus einigen inneren Joins und where-Klauseln.
 6. Die Service-Methoden haben eine for-Schleife und rufen die Repository-Methode in jeder Iteration auf. Anzahl der Iterationen ist konfigurierbar und wurde auf 1 lakh Iterationen gesetzt.
 7. System.nanoTime () wird um die Servicemethode im Controller herum verwendet, um die Zeit zu berechnen, die für die Ausführung so vieler Iterationen der Repository-Methode benötigt wurde.
 8. JdbcTemplate benötigte durchschnittlich 800 ms, um 1 lakh Repository-Aufrufe auszuführen.
 9. Querydsl benötigte durchschnittlich 5000 ms, um 1 lakh Repository-Aufrufe auszuführen.
10. Beobachtung: Querydsl ist 6 Mal langsamer als JdbcTemplate für die gleiche Abfrage. Der Overhead liegt vermutlich in der Query-Serialisierung von querydsl.

QueryDSL-Repository-Implementierung

%Vor%

JdbcTemplate-Implementierung

%Vor%

Im Grunde versuche ich genau dasselbe mit verschiedenen Bibliotheken zu machen und zu messen, welches mehr Overhead kostet 1. Führen Sie eine relativ komplexe Abfrage mit Joins durch.
2. Füllen Sie Beans aus dem Resultset.

Ich verwende H2 In-Memory-Datenbank. Die Datenbank enthält nur ein paar Datensätze für jede Tabelle. Und 1 Ergebniszeile, die der Abfrage entspricht.

Die Methode wird in einer for-Schleife (1 lakh Iterationen) ausgeführt. Und Zeit mit Hilfe von System.nanoTime () um die Schleife berechnet.

Es ist ein Spring-Boot-Projekt mit verschiedenen Endpunkten (eins für querydsl und ein anderes für jdbctemplate). Die Konfiguration für querydsl und queryfactory erfolgt wie folgt

%Vor%     
Ameen.M 05.07.2016, 16:22
quelle
1

Profilieren Sie Ihre App und sehen Sie sich an, wie viel Zeit in der Abfrage steckt. Ist es das Parsen und Kompilieren der Abfrage oder die Abfrage selbst?

Schreiben Sie Abfragen, die das gesamte Domänenobjekt oder eine Teilmenge von Spalten zurückgeben (mithilfe des JPA-Konstruktors "Select new BlaBlaDTO")?

Haben Sie die Verwendung von Spring Data JPA in Betracht gezogen, wo Sie die volle Kontrolle darüber haben, ob Sie RAW SQL, benannte Abfragen oder Spring Data JPAs für Methodenbenennungskonventionen verwenden möchten?

Ist Ihre JDBC-Verbindung so eingerichtet, dass vorbereitete Anweisungen auf der Datenbankseite zwischengespeichert werden, sodass sie nur einmal für die gleiche Abfrage mit unterschiedlichen Parametern vorbereitet werden müssen (dies macht einen großen Unterschied)?

Verwenden Sie einen Cache der ersten und zweiten Ebene, um die serverseitige Leistung zu verbessern?

Das Auswählen von Roh-JDBC als bevorzugtem Mechanismus wird am Ende schrecklich sein; komplexe Abfragen, keine schmutzige Überprüfung, keine optimistische Sperrung usw.

    
PaulNUK 17.03.2017 08:49
quelle
0

Ammen.M Wenn Sie Leistung in Bezug auf Datenbankzugriff (in JavaEE-Plattform) suchen, ist die beste Option pure JDBC , aber jeder weiß um seine Einschränkungen und die umfangreiche Verwendung von Strings mit nativem SQL. Spring Data, JPA oder QueryDSL, all diese Frameworks bieten Ihnen weitere Vorteile wie Typsicherheit, relationale Zuordnung zwischen Tabellen und Objekten.

Wenn also Ihr Team wirklich um die Leistung besorgt ist, sollten Sie darauf wetten.

    
FelipeCaparelli 09.05.2017 20:08
quelle

Tags und Links