Lier les variables Test de performance en Java

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
Fin: Ven 09 janvier 14:09:42 SGT 2009

Début: ven 09 janv 14:15:08 SGT 2009
Fin: 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
Fin: ven 09 janv 14:18:35 SGT 2009

Début: ven 09 janvier 14:19:53 SGT 2009
Fin: ven 09 janvier 14:19:59 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
Fin: ven 09 janv 14:23:17 SGT 2009

Début: ven 09 janv 14:23:49 SGT 2009
Fin: ven 09 janv 14:24:46 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
Fin: ven 09 janvier 14:37:08 SGT 2009

Début: ven 09 janv 14:41:59 SGT 2009
Fin: ven 09 janv 14:51:58 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%.