Связывание переменных Тест производительности в Java
Я слышал, как много людей говорят о том, что «Bind variables» увеличит производительность Java-приложения. Это правда? Я скептически отношусь к этому и провожу простой тест производительности междуBind variables in PreparedStatement class иNon Bind variables in Statement class
Как мне это проверить?
Я создам простой класс java и продолжу отправлять SQL-запросы вbind variables method иnon bind variables method в базу данных PostgreSQL. The java class will display start and end of the execution result time.
Какие инструменты используются?
1) База данных PostgreSQL
2) Драйвер PostgreSQL JDBC
3) Класс Java JDBC PrepareStatement и Statement
Вот исходный код для переменных Bind в классе 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 раз
Метод привязки переменной |
Метод без привязки переменных |
Начало: Пт, 9 января, 14:09:41 SGT 2009 |
Начало: Пт, 9 января, 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 раз
Метод привязки переменной |
Метод без привязки переменных |
Начало: Пт, 9 января, 14:18:31 SGT 2009 |
Начало: Пт, 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 раз
Метод привязки переменной |
Метод без привязки переменных |
Начало: Пт, 09 января, 14:22:40 SGT 2009 |
Начало: Пт, 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 раз
Метод привязки переменной |
Метод без привязки переменных |
Начало: Пт, 9 января, 14:30:51 SGT 2009 |
Начало: Пт, 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%.