Поэтому я продолжаю слышать, что PreparedStatements хороши для производительности.
У нас есть приложение Java, в котором мы используем регулярное "Statement" больше, чем мы используем "PreparedStatement". При попытке перейти к использованию более PreparedStatements, я пытаюсь получить более полное представление о том, как работают PreparedStatements - на стороне клиента и на стороне сервера.
Итак, если у нас есть некоторые типичные операции CRUD и многократно обновлять объект в приложении, помогает ли это использовать PS? Я понимаю, что нам придется закрывать PS каждый раз, в противном случае это приведет к утечке курсора.
Итак, как это помогает в производительности? Является ли драйвер кэшем предварительно скомпилированный оператор и дает мне копию при следующем подключении connection.prepareStatement? Или сервер БД помогает?
Я понимаю аргумент о преимуществах безопасности PreparedStatements, и я ценю ответы ниже, которые подчеркивают его. Однако я действительно хочу, чтобы это обсуждение было сосредоточено на преимуществах производительности PreparedStatements.
Обновление. Когда я говорю данные обновления, я действительно имею в виду, что этот метод случайным образом вызывается несколько раз. Я понимаю преимущество в предложенном ниже ответе, в котором предлагается повторно использовать оператор внутри цикла.
// some code blah blah
update();
// some more code blah blah
update();
....
public void update () throws SQLException{
try{
PreparedStatement ps = connection.prepareStatement("some sql");
ps.setString(1, "foobar1");
ps.setString(2, "foobar2");
ps.execute();
}finally {
ps.close();
}
}
Невозможно на самом деле повторно использовать java-объект ps, и я понимаю, что фактический вызов connection.prepareStatement довольно дорог.
Вот что возвращает меня к первоначальному вопросу. Это "некоторые sql" PreparedStatement все еще кэшируются и повторно используются под обложками, о которых я не знаю?
Я также должен упомянуть, что мы поддерживаем несколько баз данных.
Спасибо заранее.