Я слышал, как многие люди говорили о том, что ” Привязка переменных ” повысит производительность java-приложений. Это действительно так? я скептически отношусь и провожу простой тест производительности между переменными Привязки в классе PreparedStatement и Переменные без привязки в классе операторов
Как мне это проверить?
Я создам простой класс java и продолжу отправлять SQL-запрос в методе привязки переменных и метод не привязки переменных к базе данных PostgreSQL. Класс java будет отображать время начала и окончания результата выполнения.
Какие инструменты используются?
1) База данных PostgreSQL 2) PostgreSQL Драйвер JDBC 3) Java JDBC Класс подготовленных утверждений и инструкций
Вот исходный код для переменных привязки в классе 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","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; } } }
Вот исходный код для переменных без привязки в классе операторов
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 раз
Метод привязки переменной | Метод переменной без привязки |
Начало: Пт 09 января 14:09:41 SGT 2009 Окончание: Пт 09 января 14:09:42 SGT 2009 | Начало: Пт 09 января 14:15:08 SGT 2009 Конец: Пт Янв 09 14:15:08 СЕРЖАНТ 2009 |
1 Секунда | 0 Второй |
Вау, тестирование на 1000 циклов, результат меня удивляет, он показывает, что метод переменной без привязки немного быстрее, чем метод переменной привязки . Я сделал что-то не так? Все в порядке… я просто продолжаю свое тестирование на 10000 циклов.
Цикл 10000 раз
Метод привязки переменной | Метод переменной без привязки |
Начало: Пт 09 января 14:18:31 SGT 2009 Окончание: Пт 09 января 14:18:35 SGT 2009 | Начало: Пт 09 января 14:19:53 SGT 2009 Конец: Пт Янв 09 14:19:59 СЕРЖАНТ 2009 |
4 Секунды | 6 Секунд |
Тестирование времени цикла 10000, результат показывает, что метод переменной привязки работает быстрее, а производительность на 50% увеличивается по сравнению с методом переменной без привязки . Звучит интересно, я просто продолжаю тестирование на 100000 циклов.
Цикл 100000 раз
Метод привязки переменной | Метод переменной без привязки |
Начало: Пт 09 января 14:22:40 SGT 2009 Конец: Пт Янв 09 14:23:17 СЕРЖАНТ 2009 | Начало: Пт 09 января 14:23:49 SGT 2009 Окончание: Пт 09 января 14:24:46 SGT 2009 |
37 Секунд | 57 Секунд |
Тестирование времени цикла 100000, результат показывает, что метод переменной привязки работает быстрее и производительность увеличивается на 35% по сравнению с методом переменной без привязки . Одно последнее тестирование на время цикла 1000000.
Цикл 1000000 раз
Метод привязки переменной | Метод переменной без привязки |
Начало: Пт 09 января 14:30:51 SGT 2009 Окончание: Пт 09 января 14:37:08 SGT 2009 | Начало: Пт 09 января 14:41:59 SGT 2009 Окончание: Пт 09 января 14:51:58 SGT 2009 |
6 минут 17 секунд | 9 минут 59 секунд |
Тестирование времени цикла 1000000, результат показывает, что метод переменной привязки работает быстрее и производительность увеличивается на 37% по сравнению с методом переменной без привязки .
Вывод
Производительность между переменной привязки и переменная без привязки не так очевидна в приложении light для доступа к базе данных. Однако, когда приложение требует интенсивного доступа к базе данных, всегда рекомендуется использовать метод переменной привязки, чтобы увеличить производительность java не менее чем на 30% .
Оригинал: “https://mkyong.com/java/bind-variables-performance-test-in-java/”