JDBC:PreparedStatement.cancel() 的正确行为是啥
Posted
技术标签:
【中文标题】JDBC:PreparedStatement.cancel() 的正确行为是啥【英文标题】:JDBC: What is the correct behavior for PreparedStatement.cancel()JDBC:PreparedStatement.cancel() 的正确行为是什么 【发布时间】:2014-02-06 20:05:32 【问题描述】:我想知道当您在设置了参数值的 PreparedStatement 上调用 cancel() 时正确的行为应该是什么(假设您使用的 JDBC 驱动程序支持它)。如果未尝试执行,是否应保留设置值?
我询问的是 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】:如果 DBMS 和驱动程序都支持,则取消此 Statement 对象 中止 SQL 语句。该方法可由一个线程使用 取消另一个线程正在执行的语句。
强调“one thread
取消正在由another thread
执行的语句”。您的示例只涉及一个线程,并且该语句没有被执行,所以这不是您使用cancel()
的方式。
更多讨论here.
【讨论】:
它说它可以被另一个线程用来中止执行,而不是必须。我没有像上面概述的那样尝试使用 cancel() - 我正在举一个简单的例子来概述一个点。而且由于没有关于何时可以调用 cancel() 的规则,因此这是一个有效的示例。 啊,您误解了文档的语言。仅仅因为它说“它可以”,并不意味着有替代方案。它用于取消being executed
的语句,前提是驱动程序支持它。您的示例没有显示 cancel()
在执行期间被调用,因此它们没有任何意义。如果在调用时没有执行语句,则实现会抛出 IllegalStateException 是可行的,但您必须首先找到实际的实现来观察。
关于 JDBC 规范。像许多其他事情一样,它没有定义实际实现在这种情况下应该如何表现。以上是关于JDBC:PreparedStatement.cancel() 的正确行为是啥的主要内容,如果未能解决你的问题,请参考以下文章