2013-08-08 4 views
0

Если я не ошибаюсь, подготовленные операторы выполняются быстрее, потому что они отправляются только в первый раз на РСУБД, а затем отправляются только параметры, когда они должны быть выполнены.Doctrine2 ORM всегда готовит заявления? Должен ли я всегда использовать подготовленные заявления с DBAL?

Должен ли я всегда использовать подготовленные заявления при использовании DBAL Doctrine2 или только в узких местах? Есть ли ограничение на количество подготовленных заявлений, которые у меня могут быть?

Как насчет ORM Doctrine2? Использует ли он обычные запросы по умолчанию или готовые заявления?

ответ

1

Что касается производительности, вряд ли когда-либо один сценарий запускает запрос более одного раза. Таким образом, преимущество наличия подготовленного заявления «быстрее» почти не существует.

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

Всякий раз, когда вы пытаетесь оптимизировать вещи: Измерьте. И сначала оптимизируйте правильную вещь. Например, если у вас есть медленный запрос, вы должны сначала проверить его план выполнения и посмотреть, правильно ли используются все индексы. Переход от не подготовленного к подготовленному заявлению не изменится очень сильно.

+0

Вы имеете в виду, что подготовленные заявления не сохраняются между запросами? = s – ChocoDeveloper

+1

Да. Если вы разработаете приложение Java, то готовые операторы действительно будут иметь смысл и для производительности, потому что обработка HTTP-запросов является лишь частью этого постоянно работающего приложения. С другой стороны, вы должны ввести новые проблемы, требующие ответов, например, объединение пула db и т. Д. – Sven

+0

Чтобы завершить ответ, я просто хочу добавить, что, по-видимому, Doctrine всегда использует подготовленные инструкции за кулисами, если вы явно не используете '$ conn -> query ($ sql) 'или' $ conn-> exec ($ sql) '. – ChocoDeveloper

0

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

+0

При использовании ORM единственная ситуация с SQL-инъекцией будет заключаться в том, что сама инфраструктура ORM имеет проблему безопасности. – Sven

+0

Да, хорошо, но SQLi в Doctrine2 предотвращается как с подготовленными, так и с неподготовленными утверждениями, которые я думаю. [Пример] (http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/data-retrieval-and-manipulation.html#fetchassoc): '$ user = $ conn-> fetchAssoc ('SELECT * FROM user WHERE username =?', Array ('jwage')); ' – ChocoDeveloper

+0

Ну, вы всегда можете сделать неправильную вещь и сделать строку запроса динамической во всех других частях, кроме тех, где идут данные. Здесь ORM также помогает, потому что вы действительно не кодируете строку SQL самостоятельно, но создаете ее программно. – Sven

Смежные вопросы