Test de performances des variables de liaison en Java
J'ai entendu beaucoup de gens dire que «Bind variables» augmentera les performances des applications Java. Est-ce vraiment vrai? je suis sceptique et je fais un test de performance simple entreBind variables in PreparedStatement class etNon Bind variables in Statement class
Comment le tester?
Je vais créer une classe java simple et continuer à envoyer une requête SQL dansbind variables method etnon bind variables method à la base de données PostgreSQL. The java class will display start and end of the execution result time.
Quels outils utilisés?
1) Base de données PostgreSQL
2) Pilote JDBC PostgreSQL
3) Classe Java JDBC PrepareStatement et Statement
Voici le code source des variables Bind dans la classe PreparedStatement
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; } } }
Voici le code source des variables non liées dans la classe Statement
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; } } }
Résultat du test de performance
Boucle 1000 fois
Méthode de la variable de liaison |
Méthode de variable non liée |
Début: Ven 09 janvier 14:09:41 SGT 2009 |
Début: ven 09 janv 14:15:08 SGT 2009 |
1 seconde |
0 seconde |
Wow, le test de 1000 temps de boucle, le résultat me surprend, il montre quenon-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.
Boucle 10000 fois
Méthode de la variable de liaison |
Méthode de variable non liée |
Début: ven 09 janv 14:18:31 SGT 2009 |
Début: ven 09 janvier 14:19:53 SGT 2009 |
4 secondes |
6 secondes |
Le test de temps de boucle de 10000, le résultat montre quebind 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.
Boucle 100000 fois
Méthode de la variable de liaison |
Méthode de variable non liée |
Début: ven 09 janv 14:22:40 SGT 2009 |
Début: ven 09 janv 14:23:49 SGT 2009 |
37 secondes |
57 secondes |
Le test de temps de boucle de 100000, le résultat montre quebind variable method is faster and 35% performance increased if compare with non bind variable method. One last testing on 1000000 loop time.
Boucle 1000000 fois
Méthode de la variable de liaison |
Méthode de variable non liée |
Début: ven 09 janvier 14:30:51 SGT 2009 |
Début: ven 09 janv 14:41:59 SGT 2009 |
6 minutes 17 secondes |
9 minutes 59 secondes |
Le test de temps de boucle 1000000, le résultat montre quebind variable method is faster and 37% performance increased if compare with non bind variable method.
Conclusion
Les performances entrebind variable etnon bind variable ne sont pas si évidentes dans une application d'accès à la base de données légère. Cependant, lorsque l'application implique un accès lourd à la base de données, il est toujours conseillé àuse bind variable method to increase the java performance at least 30%.