私は ”

Bind variables

“について話している人が多く、Javaアプリケーションのパフォーマンスが向上すると聞いています。これは本当に本当ですか?私は懐疑的で、

PreparedStatementクラスの

Bind変数とStatementクラスの

Non Bind変数の間の簡単なパフォーマンステストを行います

どうすればテストできますか?

私は単純なJavaクラスを作成し、PostgreSQLデータベースに

バインド変数メソッド



非バインド変数メソッド

でSQLクエリを送信し続けます。 Javaクラスは、実行結果の時間の開始と終了を表示します**

どのツールが使用されていますか?

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

ここにPreparedStatementクラスのBind変数のソースコードがあります

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","mkyong", "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クラスのNon Bind変数のソースコードがあります

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","mkyong", "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終了:金曜日Jan 09 14 :09:42 SGT 2009 |開始日:1月09日14:15:08 SGT 2009終了:金1 09 09:15:08 SGT 2009 |

1秒

|

0秒

| ======== ========================================== =============

うわー、1000ループ時間のテストは、結果は私には驚くべきことです、それは

バインドされていない変数メソッドはバインド変数メソッド

よりもわずかに速いことを示しています。私は何か間違ったことをしましたかそれは大丈夫です…​私は10000回のループタイムでテストを続けます。

ループ10000時間

| =========================================== ======================== |バインド変数メソッド|バインド変数ではないメソッド|開始日:Fri Jan 09 14:18:31 SGT 2009終了:Fri Jan 09 14 :18:35 SGT 2009 |開始:2009年1月14日14:19:53 SGT 2009終了:金1 09 09:19:59 SGT 2009 |

4秒

|

6秒

| ======== ========================================== =============

10000回のループ時間テストでは、

バインド変数メソッドが高速で、非バインド変数メソッド

と比較すると50%のパフォーマンスが向上します。興味深い話ですが、私は100000回のループ時間でテストを続けます。

ループ100000時間

| =========================================== ======================== |バインド変数メソッド|バインド変数ではないメソッド|開始日:Fri Jan 09 14:22:40 SGT 2009 End:Fri Jan 09 14 :23:17 SGT 2009 |開始:2009年1月14日14:23:49 SGT 2009終了:金09年09月14日24:46 SGT 2009 |

37秒

|

57秒

| ======== ========================================== =============

100000回のループ時間テストでは、

バインド変数メソッドが高速で、非バインド変数メソッド

と比較すると35%のパフォーマンスが向上します。ループ時間1000000の最後のテスト。

ループ1000000時間

| =========================================== ======================== |バインド変数メソッド|バインド変数以外メソッド|開始日:Fri Jan 09 14:30:51 SGT 2009 End:Fri Jan 09 14 :37:08 SGT 2009 |開始日:09月09日14:41:59 SGT 2009終了:金09年1月14日14:51:58 SGT 2009 |

6分17秒

|

9分59秒

| ==== ========================================== =================

1000000のループ時間テストでは、

バインド変数メソッドが高速で、非バインド変数メソッド

と比較すると37%のパフォーマンスが向上します。