Какова хорошая стратегия для кэширования подготовленных операторов в Tomcat? - PullRequest
3 голосов
/ 03 июня 2009

Я ищу способ кэширования подготовленных операторов в среде сервлета (в частности, Tomcat 5.5). Это предназначено для уменьшения количества раз, когда создаются подготовленные операторы, то есть, сколько раз вызывается connection.prepareStatement(sql).

Моей первоначальной идеей было сохранение PreparedStatement объектов в сеансе, где ключ (имя атрибута) - это сам запрос. Это также можно сделать лениво.

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

Что было бы хорошей стратегией для достижения этой цели?

Есть ли метод, встроенный в Tomcat для этого? Я вижу этот ответ , где упоминается параметр poolPreparedStatements DBCP, но из документации не совсем ясно, несет ли он то же значение, что и я.

Ответы [ 2 ]

6 голосов
/ 04 июня 2009

Кэширование PreparedStatement обычно обеспечивается используемым пулом соединений.

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

Кстати, я рекомендую использовать c3p0, а не DBCP. У меня было много проблем с DBCP, которые были решены после перехода на c3p0.

0 голосов
/ 04 июня 2009

Я не уверен насчет других БД, но если вы используете Oracle, клиент JDBC будет кэшировать PreparedStatement. Возможно, вы захотите узнать, делает ли это ваша БД.

...