如何停止正在进行的java.sql.statement.executeQuery()?

如何停止正在进行的java.sql.statement.executeQuery()?,java,database,jdbc,derby,Java,Database,Jdbc,Derby,我正在使用最新的德比10.11.1.1。 这样做: DriverManager.registerDriver(new org.apache.derby.jdbc.EmbeddedDriver()) java.sql.Connection connection = DriverManager.getConnection("jdbc:derby:filePath", ...) Statement stmt = connection.createStatement(); stmt.setQueryTi

我正在使用最新的德比10.11.1.1。 这样做:

DriverManager.registerDriver(new org.apache.derby.jdbc.EmbeddedDriver())
java.sql.Connection connection = DriverManager.getConnection("jdbc:derby:filePath", ...)
Statement stmt = connection.createStatement();
stmt.setQueryTimeout(2); // shall stop query after 2 seconds but id does nothing
stmt.executeQuery(strSql);
stmt.cancel(); // this in fact would run in other thread
我得到异常
“java.sql.SQLFeatureNotSupportedException:原因:错误0A000:未实现功能:取消”

你知道有没有办法让它工作吗?或者它真的没有在Derby中实现,我需要使用不同的嵌入式数据库?关于一些免费数据库的任何提示,我可以使用它来代替derby,它支持SQL超时吗?

正如我在java文档中得到的那样

void cancel()抛出SQLException
如果DBMS和驱动程序都支持中止SQL语句,则取消此语句对象。一个线程可以使用此方法取消另一个线程正在执行的语句

它会抛出

SQLFeatureNotSupportedException
-如果JDBC驱动程序不支持此方法

您可以使用
mysql
。 有太多的嵌入式数据库可用,你可以通过

如果未实现
功能:取消
,则确定不支持取消


从外观上看,它支持两种超时查询的方法,一种是通过JDBC API,另一种是通过JDBC URL上的设置。

事实上,我发现derby中存在死锁超时,默认情况下,死锁超时也只设为60秒,我从来没有耐心达到它:)

因此,正确的答案是:

stmt.setQueryTimeout(2)确实似乎不起作用

stmt.cancel()似乎真的没有实现

但幸运的是,数据库管理器中存在超时。它被设置为60秒。看

可以使用以下命令更改时间:

statement.executeUpdate("CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY(" +
                "'derby.locks.waitTimeout', '5')");

它可以工作:)

请显示您的实际代码,而不是“类似”代码。如果没有完整的上下文,很难诊断问题。有关其他详细信息,请阅读“”。h2支持查询超时:@DougR。我的实际代码有点长。你遗漏了什么信息?恐怕Derby根本不支持cancel()。我发现服务器不支持写在哪里的
cancel()。
所以剩下的问题是如何在没有cancel()的情况下解除锁定derby查询,或者使用什么可以被cancel()的嵌入式数据库。因此,如果它没有违反任何保密协议,请发布您的实际代码,或者是导致错误的。看来mysql需要单独安装mysql服务器。似乎没有免费的嵌入式mysql。我说得对吗?我的目标是拥有一个包含DB本身的jar。是的,您需要安装mysql服务器,然后您需要与wikipedia中不同的数据库,但他们没有说是否支持cancel():(.顺便问一下,除了
cancel()之外还有其他方法吗?)
杀死死锁的事务?或者,当这种情况发生时,我注定要永远关闭整个应用程序?正如nathan tolds h2所支持的那样。你可以这样做。是的,在h2中,表锁超时是默认的,并且可以通过
语句进行更改。执行(“设置锁超时5000”);