Bindungsvariablen Performance Test in Java

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
Ende: Fr Jan 09 14:09:42 SGT 2009

Beginn: Fr 09 Jan 14:15:08 SGT 2009
Ende: Fr Jan 09 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
Ende: Fr Jan 09 14:18:35 SGT 2009

Start: Fr Jan 09 14:19:53 SGT 2009
Ende: Fr Jan 09 14:19:59 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
Ende: Fr Jan 09 14:23:17 SGT 2009

Beginn: Fr Jan 09 14:23:49 SGT 2009
Ende: Fr Jan 09 14:24:46 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
Ende: Fr Jan 09 14:37:08 SGT 2009

Beginn: Fr Jan 09 14:41:59 SGT 2009
Ende: Fr Jan 09 14:51:58 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.