Javaのバインド変数パフォーマンステスト
「Bind variables」がJavaアプリケーションのパフォーマンスを向上させると多くの人が話していると聞きました。 これは本当に本当ですか? 私は懐疑的で、Bind variables in PreparedStatement classとNon 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: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:19:53 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:49 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:41:59 SGT 2009 |
6分17秒 |
9分59秒 |
1000000ループ時間テストの結果は、bind variable method is faster and 37% performance increased if compare with non bind variable methodであることを示しています。
結論
bind variableとnon bind variableの間のパフォーマンスは、ライトデータベースアクセスアプリケーションではそれほど明白ではありません。 ただし、アプリケーションに大量のデータベースアクセスが含まれる場合は、常にuse bind variable method to increase the java performance at least 30%へのアドバイスです。