2014-02-06 2 views
1

Мне интересно, какое правильное поведение должно быть при вызове 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(); 

ответ

1

Отменяет этот объект, если себе как СУБД и поддержка драйверов прерывания оператора SQL. Этот метод может использоваться одним потоком для отменить инструкцию, выполняемую другим потоком.

Акцент на «one thread отменить заявление, что в настоящее время выполняется с помощью another thread». Ваши примеры включают только один поток, и оператор не выполняется, так что вы не используете cancel().

Более подробное обсуждение here.

+0

Он говорит, что он * может * быть использован другим потоком, чтобы прервать выполнение, а не * должны *. Я не пытаюсь использовать cancel() так, как я изложил выше - я даю тривиальный пример, чтобы набросать точку. И поскольку нет правил о том, когда можно вызвать функцию cancel(), это допустимый пример. – minus

+1

Ах, вы неправильно поняли язык документации. Просто потому, что он говорит «это может», не означает, что есть альтернатива. Он используется для отмены оператора, который «выполняется», если драйвер поддерживает его. В ваших примерах не отображается 'cancel()', вызываемых во время выполнения, поэтому они не имеют смысла. Вполне возможно, что реализация вызовет исключение IllegalStateException, если оператор не выполняется во время вызова, но вам нужно будет найти фактическую реализацию для наблюдения в первую очередь. – Kayaman

+0

Что касается спецификации JDBC. Как и многие другие вещи, он не определяет, как фактические реализации должны вести себя в таком случае. – Kayaman

Смежные вопросы