Я смотрел на этот вопрос Повторное использование PreparedStatement несколько раз
Допустим, у меня есть две версии кода. Первый закрывает PreparedStatement
после каждого использования внутри for
l oop.
connection.autoCommit(false)
for (int i=0; i<1000; i++) {
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setObject(1, someValue);
preparedStatement.executeQuery();
preparedStatement.close(); // ? Close after each use.
}
connection.commit();
connection.close();
В этом втором примере PreparedStatement
остается открытым для повторного использования, чтобы закрыть позже после the for
l oop.
connection.autoCommit(false)
PreparedStatement preparedStatement = connection.prepareStatement(sql);
for (int i=0; i<1000; i++) {
preparedStatement.clearParameters();
preparedStatement.setObject(1, someValue);
preparedStatement.executeQuery();
}
preparedStatement.close(); // ? Close after repeated uses.
connection.commit();
connection.close();
Как видите, я создаю и закрываю PS в l oop или повторно использую тот же PS. Я использую postgres и согласно документации
Подготовленные операторы действуют только в течение текущего сеанса базы данных. Когда сеанс заканчивается, подготовленный оператор забывается
Как я понимаю, если я использую postgres, то два приведенных выше примера будут обрабатываться одинаково, потому что они выполняются в одной транзакции. Так, например, в первом примере кода с новым оператором внутри l oop, postgres создаст единый планировщик для оператора, и даже если мы закроем оператор и создадим новый в l oop postgres, будет повторно использоваться кешированный, потому что это происходит в том же сеансе (транзакции), и этот кешированный планировщик будет удален только тогда, когда транзакция будет зафиксирована (connection.commit()
). Я прав ?