Действительно ли дорого держаться за PreparedStatements? (Java & JDBC)

Я пытаюсь выяснить, эффективно ли для меня кэшировать все мои операторы, когда я создаю свое соединение с базой данных или если я должен только создать тех, которые больше всего используются и создают другие, если/когда они необходимы..

Кажется глупым создать все операторы во всех клиентских потоках. Любая обратная связь значительно ценилась бы.

7
задан sbook 12 June 2010 в 21:07
поделиться

3 ответа

Немного приличная база данных уже их кэширует. Просто запустите Connection # prepareStatement () в тот момент, когда вам действительно нужно выполнить запрос. На самом деле у вас также нет другого выбора, поскольку соединение, оператор и набор результатов должны быть получены и закрыты в кратчайшей возможной области, то есть в блоке try-finally тем же способом, что и вы выполняете запрос.

Открытие и закрытие соединения для каждого запроса по очереди действительно может быть дорогостоящим. Распространенным решением этой проблемы является использование пула соединений , например c3p0 .

10
ответ дан 6 December 2019 в 12:46
поделиться

Я думаю, вы слишком сильно беспокоитесь, подготовленные операторы уже выигрывают от нескольких уровней кэширования:

  • На уровне базы данных: приличная база данных будет повторно использовать план доступа для данного подготовленного оператора .
  • На уровне пула соединений: приличный пул соединений будет кэшировать объекты PreparedStatement для каждого соединения с базой данных в пуле (и возвращать кешированный PreparedStatement при последующих вызовах prepareStatement о подключении).

На самом деле, я бы даже сказал, что вы смотрите не в том направлении. Лучшая практика, если вы хотите разработать масштабируемое решение, - использовать пул соединений и не удерживать соединение дольше, чем необходимо, и освободить его (чтобы освободить ресурсы базы данных), когда вы закончите с ним.

4
ответ дан 6 December 2019 в 12:46
поделиться

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

2
ответ дан 6 December 2019 в 12:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: