私は ”
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%のパフォーマンスが向上します。