Многопоточность - использование подготовленного оператора MySQL для Java-коннектора - PullRequest
1 голос
/ 15 ноября 2011

Я создал класс Java, который работает в своем собственном потоке, который работает через очередь запросов MySQL, чтобы он не блокировал основной поток приложения.Я хочу использовать подготовленные операторы, однако, если я продолжу использовать один и тот же подготовленный оператор, то, если в очереди два или более таких же подготовленных оператора (я использую один и тот же подготовленный объект для каждого запроса этого типа), он будет иметь неправильное значениеТитулы.Если я сделаю новое подготовленное заявление каждый раз, будет ли оно перекомпилировать подготовленное утверждение каждый раз, когда оно выполняется, или оно обнаружит, что оно уже скомпилировано и просто выполнено?

Ответы [ 3 ]

2 голосов
/ 15 ноября 2011

Я думаю, что вы действительно не сможете использовать функцию пула подготовленных операторов, доступную в реализациях пула соединений Java, таких как Apache DBCP.Это потому, что вы храните подготовленные объекты операторов в очереди.Если бы вы могли вместо этого хранить SQL и параметры в пользовательском классе и создавать / выполнять PreparedStatements в потоке выполнения, вы можете получить преимущество пула, используя что-то вроде DBCP

См. Конфигурации DBCP документы о том, как включить пул операторов (poolPreparedStatements)

1 голос
/ 15 ноября 2011

будет ли он перекомпилировать подготовленный оператор при каждом его выполнении или обнаружит, что он уже скомпилирован и просто выполнен?

Это зависит от СУБД, а не от Java, ноОбщая идея заключается в том, что он может обнаружить повторное использование существующего скомпилированного оператора и объединяет их в секретном месте, либо в драйвере, либо на сервере.См. Спецификацию JDBC 4.0, № 11.6, «Повторное использование операторов в пулированных соединениях».

0 голосов
/ 15 ноября 2011

Из учебника Java

Если вы хотите выполнить объект Statement много раз, он обычно сокращает время выполнения, чтобы вместо этого использовать объект PreparedStatement.

Основная особенность объекта PreparedStatement состоит в том, что, в отличие от объекта Statement, при создании ему предоставляется оператор SQL. Преимущество этого состоит в том, что в большинстве случаев этот оператор SQL сразу отправляется в СУБД, где он компилируется. В результате объект PreparedStatement содержит не просто оператор SQL, а предварительно скомпилированный оператор SQL. Это означает, что при выполнении PreparedStatement СУБД может просто выполнить SQL-оператор PreparedStatement без предварительной компиляции.

http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html#supply_values_ps

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...