バインド変数Javaでのパフォーマンステスト

Javaのバインド変数パフォーマンステスト

Bind variables」がJavaアプリケーションのパフォーマンスを向上させると多くの人が話していると聞きました。 これは本当に本当ですか? 私は懐疑的で、Bind variables in PreparedStatement classNon Bind variables in Statement classの間で簡単なパフォーマンステストを行います

どうやってテストしますか?

単純なJavaクラスを作成し、bind variables methodおよびnon bind variables methodでSQLクエリをPostgreSQLデータベースに送信し続けます。 The java class will display start and end of the execution result time.

使用中のツールは何ですか?

1)PostgreSQLデータベース
2)PostgreSQL JDBCドライバー
3)Java JDBCPrepareStatementおよびStatementクラス

以下は、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;
      }
  }
}

以下は、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;
      }
  }
}

性能試験結果

ループ1000時間

変数メソッドをバインドする

非バインド変数メソッド

開始:Fri Jan 09 14:09:41 SGT 2009
終了:Fri Jan 09 14:09:42 SGT 2009

開始:Fri Jan 09 14:15:08 SGT 2009
終了:Fri Jan 09 14:15:08 SGT 2009

1秒

0秒

うわー、1000ループ時間のテスト、結果は私を驚かせます、それはnon-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.

ループ10000回

変数メソッドをバインドする

非バインド変数メソッド

開始:Fri Jan 09 14:18:31 SGT 2009
終了:Fri Jan 09 14:18:35 SGT 2009

開始:Fri Jan 09 14:19:53 SGT 2009
終了:Fri Jan 09 14:19:59 SGT 2009

4秒

6秒

10000ループ時間テストの結果は、bind 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.

ループ100000時間

変数メソッドをバインドする

非バインド変数メソッド

開始:Fri Jan 09 14:22:40 SGT 2009
終了:Fri Jan 09 14:23:17 SGT 2009

開始:Fri Jan 09 14:23:49 SGT 2009
終了:Fri Jan 09 14:24:46 SGT 2009

37秒

57秒

100000ループ時間テストの結果は、bind variable method is faster and 35% performance increased if compare with non bind variable methodであることを示しています。 One last testing on 1000000 loop time.

ループ1000000時間

変数メソッドをバインドする

非バインド変数メソッド

開始:Fri Jan 09 14:30:51 SGT 2009
終了:Fri Jan 09 14:37:08 SGT 2009

開始:Fri Jan 09 14:41:59 SGT 2009
終了:Fri Jan 09 14:51:58 SGT 2009

6分17秒

9分59秒

1000000ループ時間テストの結果は、bind variable method is faster and 37% performance increased if compare with non bind variable methodであることを示しています。

結論

bind variablenon bind variableの間のパフォーマンスは、ライトデータベースアクセスアプリケーションではそれほど明白ではありません。 ただし、アプリケーションに大量のデータベースアクセスが含まれる場合は、常にuse bind variable method to increase the java performance at least 30%へのアドバイスです。