2009-06-03 6 views
3

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

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

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

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

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

ответ

6

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

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

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

0

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

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