2015-05-19 52 views
2

我正在使用最新的derby10.11.1.1。 做这样的事情:如何停止正在进行的java.sql.statement.executeQuery()?

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: Caused by: ERROR 0A000: Feature not implemented: cancel"

你知道,如果是的方式有怎样使它工作?或者它真的没有在Derby中实现,我需要使用不同的嵌入式数据库?任何提示一些免费的数据库,我可以使用,而不是德比,哪些会支持SQL超时?

+0

请出示您的实际代码,而不是“像”了。如果没有完整的背景,很难诊断问题。请阅读“[问]”了解更多详情。 –

+2

h2支持查询超时:http://stackoverflow.com/q/21984515/217324 –

+0

@DougR。我的实际代码稍长一些。你错过了哪些信息?恐怕德比根本不支持cancel()。我发现[参考手册页](http://db.apache.org/derby/docs/10.11/ref/rrefexcept71493.html),其中写有'cancel()不被服务器支持.'所以剩下的问题就是如何解锁不需要cancel()的derby查询,还可以使用其他嵌入式数据库(可以使用cancel())。 –

回答

1

正如我在Java文档得到

无效取消()抛出的SQLException
取消此Statement对象如果DBMS和驱动程序都支持中止SQL语句。这个方法可以被一个线程用来取消另一个线程正在执行的语句。

,它会抛出

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

你可以mysql去。 有这么多的嵌入式可用的数据库,你可以去通过 embedded database

+0

似乎mysql会要求分开安装mysql服务器。似乎没有免费的嵌入式MySQL。我对吗?我的目标是拥有一个包含数据库本身的jar。 –

+1

是的,你需要安装服务器的MySQL然后你需要不同的数据库,如在维基百科http://en.wikipedia.org/wiki/Embedded_database – Prashant

+0

但他们不说是否支持cancel()或。:(。有没有比'cancel()'杀死死锁交易还有其他方法?或者当我发生这种情况时,我会永远注定失败,我需要关闭整个应用程序? –

1

如果你得到Feature not implemented: cancel那么这是肯定的,取消不支持。

this post by H2's author看起来像H2支持两种方式来通过JDBC API和通过JDBC URL上的设置超时查询。

+0

Yup works - 在H2表中,锁定超时是默认的,可以通过'statement.execute(“SET LOCK_TIMEOUT 5000”)改变;'' –

0

事实上,我发现德比有死锁超时,默认情况下只设置为60秒,我从来没有耐心达到它:)。

因此正确答案应该是:

stmt.setQueryTimeout(2);真正似乎不工作

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

但幸运的是超时的数据库管理器存在。它设置为60秒。请参阅derby dead-locks

时间可以用命令来改变:

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

而且它的工作原理:)

相关问题