Какова хорошая стратегия кэширования подготовленных операторов в Tomcat?

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

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

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

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

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


person Ovesh    schedule 03.06.2009    source источник


Ответы (2)


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

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

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

person David Rabinowitz    schedule 04.06.2009

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

person mamboking    schedule 03.06.2009