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

时间:2015-05-19 16:49:49

标签: java database jdbc derby

我正在使用最新的derby10.11.1.1。 做这样的事情:

public class piece
{
    public int height { get; set; }
    public int width { get; set; }
    public int[] shape { get; set; }
    public int quality { get; set; }
    public int x { get; set; }
    public int y { get; set; }

    public static T CloneJson<T>(this T source)
    {
        // Don't serialize a null object, simply return the default for that object
        if (Object.ReferenceEquals(source, null))
        {
            return default(T);
        }

        return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(source));
    }
}

我得到例外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

你知道是否有办法让它发挥作用?或者它真的没有在Derby中实现,我需要使用不同的嵌入式数据库?一些免费数据库的提示,我可以使用而不是德比,哪些会支持SQL超时?

3 个答案:

答案 0 :(得分:1)

我进入了java docs

  

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

它会抛出

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

你可以选择mysql。 你可以通过这么多的嵌入式数据库 embedded database

答案 1 :(得分:1)

如果你得到Feature not implemented: cancel,那就明确了,不支持取消。

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

答案 2 :(得分:0)

实际上我发现德比中存在死锁超时,默认情况下只设置为60秒,我从来没有耐心等待它:)。

所以正确答案是:

stmt.setQueryTimeout(2);似乎无法正常工作

stmt.cancel();似乎没有实施

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

可以使用命令更改时间:

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

它有效:)