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() 的正确行为是啥的主要内容,如果未能解决你的问题,请参考以下文章

什么是JDBC?

有关jdbc以及JDBC事务的相关操作

JDBC笔记--- JDBC概述

JDBC连接ORACLE

JDBC

JDBC-00-笔记