Bindungsvariablen Leistungstest in Java
Ich habe gehört, dass viele Leute über „Bind variables“ sprechen, um die Leistung von Java-Anwendungen zu steigern. Ist das wirklich wahr? Ich bin skeptisch und mache einen einfachen Leistungstest zwischenBind variables in PreparedStatement class undNon Bind variables in Statement class
Wie teste ich es?
Ich werde eine einfache Java-Klasse erstellen und weiterhin eine SQL-Abfrage inbind variables method undnon bind variables method an die PostgreSQL-Datenbank senden. The java class will display start and end of the execution result time.
Welche Tools werden verwendet?
1) PostgreSQL-Datenbank
2) PostgreSQL-JDBC-Treiber
3) Java JDBC PrepareStatement- und Anweisungsklasse
Hier ist der Quellcode für Bindungsvariablen in der PreparedStatement-Klasse
import java.sql.DriverManager; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Date; public class BindVariableJDBC { public static void main(String[] argv) { ResultSet rs = null; Connection conn = null; PreparedStatement pstatement = null; try { conn = DriverManager.getConnection("jdbc:postgresql://127.0.0.1:5432/db_test","example", "password"); Class.forName("org.postgresql.Driver"); pstatement = conn.prepareStatement("SELECT * FROM s_user where userid = ?"); System.out.println("Start: " + new Date()); for (int i = 1; i < 100000; i++) { pstatement.setInt(1, i); rs = pstatement.executeQuery(); } System.out.println("End: " + new Date()); } catch (Exception e) { e.printStackTrace(); return; } } }
Hier ist der Quellcode für Non-Bind-Variablen in der Statement-Klasse
import java.sql.DriverManager; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.util.Date; public class NonBindVariableJDBC { public static void main(String[] argv) { ResultSet rs = null; Connection conn = null; Statement statement = null; try { conn = DriverManager.getConnection("jdbc:postgresql://127.0.0.1:5432/db_test","example", "password"); Class.forName("org.postgresql.Driver"); statement = conn.createStatement(); System.out.println("Start: " + new Date()); for (int i = 1; i < 100000; i++) { rs = statement.executeQuery("SELECT * FROM s_user where userid = " + i); } System.out.println("End: " + new Date()); } catch (Exception e) { e.printStackTrace(); return; } } }
Leistungstestergebnis
1000-mal Schleife
Variable Methode binden |
Nicht bindende variable Methode |
Start: Fr Jan 09 14:09:41 SGT 2009 |
Beginn: Fr 09 Jan 14:15:08 SGT 2009 |
1 Sekunde |
0 Sekunden |
Wow, das Ergebnis des 1000-Schleifen-Zeit-Tests überrascht mich, es zeigt, dassnon-bind variable method is slight faster than bind variable method. Am i did something wrong? It’s ok… i just continue my testing on 10000 loop time.
Schleife 10000 Zeit
Variable Methode binden |
Nicht bindende variable Methode |
Beginn: Fr Jan 09 14:18:31 SGT 2009 |
Start: Fr Jan 09 14:19:53 SGT 2009 |
4 Sekunden |
6 Sekunden |
Das Ergebnis des 10000-Schleifenzeittests zeigt, dassbind variable method is faster and 50% performance increased if compare with non bind variable method. Sound interesting , i just continue my testing on 100000 loop time.
Schleife 100000 Zeit
Variable Methode binden |
Nicht bindende variable Methode |
Beginn: Fr Jan 09 14:22:40 SGT 2009 |
Beginn: Fr Jan 09 14:23:49 SGT 2009 |
37 Sekunden |
57 Sekunden |
Das Ergebnis des 100000-Schleifenzeittests zeigt, dassbind variable method is faster and 35% performance increased if compare with non bind variable method. One last testing on 1000000 loop time.
Schleife 1000000 Zeit
Variable Methode binden |
Nicht bindende variable Methode |
Beginn: Fr Jan 09 14:30:51 SGT 2009 |
Beginn: Fr Jan 09 14:41:59 SGT 2009 |
6 Minuten 17 Sekunden |
9 Minuten 59 Sekunden |
Das Ergebnis des 1000000-Schleifenzeittests zeigt, dassbind variable method is faster and 37% performance increased if compare with non bind variable method.
Fazit
Die Leistung zwischenbind variable undnon bind variable ist in einer leichten Datenbankzugriffsanwendung nicht so offensichtlich. Wenn die Anwendung jedoch einen umfangreichen Datenbankzugriff umfasst, wirduse bind variable method to increase the java performance at least 30% immer empfohlen.