Подтвердить что ты не робот

Кэширование PreparedStatement - что это значит (как это работает)

Я использую, например, c3p0 с некоторыми определенными "maxStatements" для кэширования readyStatement. Что действительно делает это кеширование? Какие данные он кэширует. На каком уровне (db, application,..)? Приятно понять это из примера. Например, у меня есть запрос

выберите * из sometable, где somecolumn =?

Теперь я отправляю его в подготовленный оператор, который не кэшируется. И теперь я отправляю его, и он кэшируется. Какая разница. Что произошло в первом случае и во втором. Что отправляется на сервер БД в первом случае и во втором?

Спасибо.

4b9b3361

Ответ 1

Без кэширования вы получите новое PreparedStatement каждый раз, когда вы запрашиваете его из Connection. При кэшировании вы часто получаете тот же объект Java типа PreparedStatement, если вы предоставляете ту же строку SQL. Если вы предоставляете тот же SQL в PreparedStatement, даже с разными параметрами, часто база данных может повторно использовать такую ​​информацию, как план выполнения, но только если вы продолжаете использовать тот же PreparedStatement. Кэширование делает это проще, не требуя, чтобы ваше приложение поддерживало эту ссылку PreparedStatement.

Ответ 2

Ответ Джона Уоттса очень хорош.

Обратите внимание, что нет кода примера, который может быть предоставлен, поскольку кэширование Statement прозрачно: используемый код выглядит точно так же, как и код, который этого не делает. Вы просто включаете кэширование Statement в c3p0, устанавливая maxStatements и maxStatementsPerConnection на положительное значение.

Любое преимущество в производительности от кэширования инструкций зависит от драйвера базы данных /JDBC. Чтобы узнать, помогает ли кеширование операторов, попробуйте сначала профилировать приложение, а затем кеширование выводов, а затем с maxStatementsPerConnection установите количество подготовленных запросов к операторам, которые ваше приложение использует повторно. Для некоторых приложений/баз данных/драйверов вы увидите значительную выгоду. Для других вы не увидите никакой материальной выгоды.