我尝试过的...
使用标准:
criteria.setTimeout(1);
=> 零效应
使用 HQL:
return getSession().createQuery("from User").setTimeout(1).list();
=> 零效应
甚至在事务级别上尝试过:
@Transactional(timeout = 1, readOnly = true, propagation = Propagation.REQUIRES_NEW)
一些效果;执行查询后会引发异常,但事务在 1 秒后未中止。
这是在带有 Atomikos TM 的 Jetty 服务器上运行的。
如何在特定查询上指定超时,以便在超时后中止调用(这不会是 1 秒,这只是为了更快地测试)?
更新
当运行相同的测试但绕过 Atomikos/Hibernate/Spring(因此使用普通 JDBC)时,超时确实有效(大约至少;它不会正好是 1 秒,在 H2 上它非常接近,在 Oracle 上有时超过 2 秒)。结果如预期:SQLException: ORA-01013: user requested cancel of current operation。
更新
在调试休眠时,我看到在 PreparedStatement 上设置了超时,但它似乎没有效果。