Мне интересно, какое правильное поведение должно быть при вызове cancel() на PreparedStatement, у которого установлены значения параметров (при условии, что поддерживаемый вами драйвер JDBC поддерживает его). Должны ли сохраняться заданные значения, если выполнение не было выполнено?JDBC: Какое правильное поведение для PreparedStatement.cancel()
Я спрашиваю о правильном поведении, определенном JDBC, а не о поведении конкретного драйвера базы данных.
Например,
String query = "SELECT * FROM t where t.c1 = ?";
PreparedStatement ps = con.prepareStatement(query);
ps.setInt(1, 1);
ps.cancel();
ps.execute();
В случае, если значение параметра 1 сохраняется?
Что относительно этого? Сохраняются ли оба значения параметров пакета?
Reader charReader1 = new InputStream(new FileInputStream("SomeBigFile"));
ps.setCharacterInputStream(1, charReader1, -1);
ps.addBatch();
ps.cancel();
Reader charReader2 = new InputStream(new FileInputStream("AnotherBigFile"));
ps.setCharacterInputStream(1, charReader2, -1);
ps.addBatch();
ps.executeBatch();
Он говорит, что он * может * быть использован другим потоком, чтобы прервать выполнение, а не * должны *. Я не пытаюсь использовать cancel() так, как я изложил выше - я даю тривиальный пример, чтобы набросать точку. И поскольку нет правил о том, когда можно вызвать функцию cancel(), это допустимый пример. – minus
Ах, вы неправильно поняли язык документации. Просто потому, что он говорит «это может», не означает, что есть альтернатива. Он используется для отмены оператора, который «выполняется», если драйвер поддерживает его. В ваших примерах не отображается 'cancel()', вызываемых во время выполнения, поэтому они не имеют смысла. Вполне возможно, что реализация вызовет исключение IllegalStateException, если оператор не выполняется во время вызова, но вам нужно будет найти фактическую реализацию для наблюдения в первую очередь. – Kayaman
Что касается спецификации JDBC. Как и многие другие вещи, он не определяет, как фактические реализации должны вести себя в таком случае. – Kayaman