что быстрее?Заявление или PreparedStatement - PullRequest
6 голосов
/ 03 марта 2012

Часто в сети можно найти такой код:

private static final String SQL = "SELECT * FROM table_name";
....

и для этого SQL-запроса используется PreparedStatement.Почему?
Как я знаю, PreparedStatement тратит время на прекомпиляцию оператора SQL.Получается, что оператор быстрее, чем PreparedStatement.Или я ошибаюсь?

Ответы [ 4 ]

12 голосов
/ 03 марта 2012

Подготовленные операторы работают намного быстрее, если вам приходится выполнять один и тот же оператор несколько раз с разными данными.Это потому, что SQL будет проверять запрос только один раз, тогда как если вы просто используете оператор, он будет проверять запрос каждый раз.

Другое преимущество использования PreparedStatements состоит в том, чтобы избежать возникновения уязвимости SQL-инъекции - хотя в вашем случаеваш запрос настолько прост, что вы с ним не сталкивались.

Для вашего запроса разница между выполнением подготовленного оператора и оператором, вероятно, незначительна.

РЕДАКТИРОВАТЬ: В ответ на ваш комментарий нижевам нужно будет внимательно посмотреть на класс DAO, чтобы увидеть, что он делает.Например, если каждый раз, когда вызывается метод, он заново создает подготовленный оператор, тогда вы потеряете все преимущества использования подготовленного оператора.

То, чего вы хотите достичь, - это инкапсуляция вашего уровня персистентности, чтобы они не представляли собой конкретный вызов MySQL или Postgres или чего-либо еще, что вы используете, и в то же время использовали преимущества производительности и безопасности оттакие вещи, как готовые заявления.Чтобы сделать это, вам нужно полагаться на собственные объекты Java, такие как PreparedStatement.

Лично я бы создал свой собственный класс DAO для выполнения операций CRUD, используя Hibernate и API-интерфейс Java Persistence для инкапсуляции всего этого, и чтоследует использовать подготовленные заявления для обеспечения безопасности.Если у вас есть конкретный вариант использования для выполнения повторяющихся операций, я был бы склонен обернуть это в свой собственный объект.

Hibernate можно настроить для использования с любым поставщиком базы данных, которого вы используете через файл XML, итаким образом, он обеспечивает действительно аккуратную инкапсуляцию вашего персистентного слоя.Тем не менее, это довольно сложный продукт, чтобы получить право!

4 голосов
/ 03 марта 2012

В большинстве случаев запросы не так просты, как ваш пример.Если в запросе есть какие-либо изменения, то есть какие-либо параметры, которые не известны во время компиляции, вы должны использовать PreparedStatement, чтобы избежать уязвимостей SQL-инъекций.Это превосходит любые проблемы производительности.Если есть какая-либо разница между PreparedStatement и Statement, это будет сильно зависеть от конкретного рассматриваемого драйвера JDBC, и большую часть времени штраф будет незначительным по сравнению со стоимостью обращения к базе данных, выполнения фактического запроса и получения результатов обратно.

0 голосов
/ 28 декабря 2015

Согласно Моему знанию PreparedStatement намного быстрее, чем утверждение. Вот некоторые причины, по которым подготовленное заявление выполняется быстрее, чем утверждение, пожалуйста, прочитайте более подробно.
JDBC API обеспечивает функциональность связи с базой данных. Затем мы пытаемся выполнить запрос с использованием оператора и подготовленного заявления.
Есть четыре шага для выполнения запроса.

Разбор SQL-запроса.
Скомпилируйте этот запрос.
оптимизация пути сбора данных.
выполнить запрос.

Интерфейс оператора подходит, когда нам не нужно выполнять запрос несколько раз.

Недостатки интерфейса операторов. хакер может легко взломать данные. Например, предположим, что у нас есть один запрос, в котором имя пользователя и пароль являются параметрами, которые вы можете задать правильные параметры: username='abc@example.com 'и password =' ​​abc123 'на самом деле это текущий Но хакер может сделать username =' abc @ example.com 'или' 1 '= 1 и password =' ​​', что означает, что вы можете успешно войти в систему. так что это возможно в Заявлении.
И sql проверять каждый раз, когда мы получаем данные из базы данных.

Таким образом, у Java есть решение для этой вышеупомянутой проблемы, которое является PreparedStatement. Этот интерфейс имеет много преимуществ. Основным преимуществом подготовленного заявления является то, что SQL не проверяет запрос каждый раз. так что вы можете быстро получить результат. Пожалуйста, ознакомьтесь с приведенными ниже преимуществами подготовленного заявления.

1) Мы можем смело предоставлять значение параметров запроса с помощью метода установки. 2) это предотвращает внедрение SQL, потому что оно автоматически экранирует специальные символы. 3) Когда мы используем оператор выше, каждый раз выполняются четыре шага. Но когда мы используем PreparedStatement, выполняются только последние шаги, так что это быстрее, чем оператор.

0 голосов
/ 03 марта 2012

Быстрее не здесь. Синтаксический анализ sql обычно будет крошечной частью общего выполнения. Подробнее на Когда мы должны использовать PreparedStatement вместо Statement?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...