Я пытаюсь выяснить, эффективно ли для меня кэшировать все мои операторы, когда я создаю свое соединение с базой данных или если я должен только создать тех, которые больше всего используются и создают другие, если/когда они необходимы..
Кажется глупым создать все операторы во всех клиентских потоках. Любая обратная связь значительно ценилась бы.
Немного приличная база данных уже их кэширует. Просто запустите Connection # prepareStatement ()
в тот момент, когда вам действительно нужно выполнить запрос. На самом деле у вас также нет другого выбора, поскольку соединение, оператор и набор результатов должны быть получены и закрыты в кратчайшей возможной области, то есть в блоке try-finally
тем же способом, что и вы выполняете запрос.
Открытие и закрытие соединения для каждого запроса по очереди действительно может быть дорогостоящим. Распространенным решением этой проблемы является использование пула соединений , например c3p0 .
Я думаю, вы слишком сильно беспокоитесь, подготовленные операторы уже выигрывают от нескольких уровней кэширования:
PreparedStatement
для каждого соединения с базой данных в пуле (и возвращать кешированный PreparedStatement
при последующих вызовах prepareStatement
о подключении). На самом деле, я бы даже сказал, что вы смотрите не в том направлении. Лучшая практика, если вы хотите разработать масштабируемое решение, - использовать пул соединений и не удерживать соединение дольше, чем необходимо, и освободить его (чтобы освободить ресурсы базы данных), когда вы закончите с ним.
Для меня это звучит как своего рода преждевременная оптимизация, о которой я бы не стал беспокоиться, пока не получу некоторую информацию, говорящую мне, что это имеет значение. Если ваш доступ к базе данных неэффективен, я бы заподозрил вашу схему или доступ к значениям еще до того, как подумал бы о кешировании подготовленных операторов.