【问题标题】:How to delay executeQuery() of jdbc preparedStatement intentionally?如何故意延迟jdbcpreparedStatement的executeQuery()?
【发布时间】:2018-01-02 16:15:04
【问题描述】:

Java API 文档中提到 Statement 接口有 setQueryTimeOut 方法。我确实将它与 PreparedStatement 一起使用。 现在不幸的是,我无法确认它确实有效。 我已将其设置为 1s,如下所示:

pstmt = connection.prepareStatement(sqlQuery);
pstmt.setString(1, age);
pstmt.setQueryTimeout(1);
resultSet = pstmt.executeQuery();

查询很简单 根据年龄从视图中选择查询。 但 Db 响应变得更好,查询的执行在 500 毫秒内完成。如何故意延迟查询的执行,以便捕获 setQueryTimeOut 方法抛出的 SQLException?

【问题讨论】:

  • 执行耗时较长的查询,通过延迟数据包的网络代理连接等?
  • Statement.setQueryTimeout() 不用于故意延迟查询执行;相反,它的目的是指定一个超时值,之后查询执行将被中止(默认为无超时)。 为什么你想让执行变慢?
  • 没错。我想测试相同简单查询的超时。我想看看超时后抛出的异常。
  • @MarkRotteveel 在给出一个非常复杂的查询后它确实起作用了。我能够看到异常。有什么方法可以看到一个简单的查询?
  • 使用很短的超时时间,或者使用延迟数据包的网络代理。

标签: java jdbc oracle11g timeout


【解决方案1】:

您可以通过 java.util.concurrent package 的 TimeUnit 类暂停。

TimeUnit.SECONDS.sleep(1);

睡一秒钟或

TimeUnit.MINUTES.sleep(1);

睡一分钟。

这样实现

pstmt = connection.prepareStatement(sqlQuery);
pstmt.setString(1, age);
TimeUnit.MINUTES.sleep(1);
resultSet = pstmt.executeQuery();

需要注意的是,sleep 方法会抛出 InterruptedException 异常,因此您必须注意这一点。

另外,如果您不想要 TimeUnit 类的开销,只需按以下方式在您的代码中调用 Thead.sleep(long)。

pstmt = connection.prepareStatement(sqlQuery);
pstmt.setString(1, age);
Thread.sleep(60);
resultSet = pstmt.executeQuery();

但是你必须再次注意 InterruptedException 哪个 sleep 方法抛出。

【讨论】:

  • 我认为 OP 需要延迟 resultSet = pstmt.executeQuery(); 语句本身的执行。
  • 没错。我想延迟 executeQuery() 本身,以便验证超时。
  • 哦,对不起!没想到,调用setQueryTimeout方法的时候不能增加时间吗
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多