我正在使用最新的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超时?
答案 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')");
它有效:)