【问题标题】:java/jdbc timeout in clojureclojure 中的 java/jdbc 超时
【发布时间】:2020-03-26 07:42:22
【问题描述】:

我正在尝试为jdbc/queryjdbc/execute! 添加超时。在网络的某个地方,我发现这两个函数都将:timeout 作为一个选项。 Documention 还说选项被传递给prepare-statment,它接受:timeout 作为一个选项。

我的函数调用看起来像,

(jdbc/query db-read-spec query {:timeout 2})

(jdbc/execute! db-write-spec query {:timeout 2})

这是怎么做的?如果是,我该如何测试?

如果有不同的方法可以测试,那也可以。

【问题讨论】:

  • 您是在问,因为它不起作用吗?天真的测试会使用不合理的小超时并假设它会超时。

标签: testing jdbc clojure timeoutexception


【解决方案1】:

:timeout 选项导致在 clojure.java.jdbc 的内部使用的 PreparedStatement 上调用 .setQueryTimeout。它以 为单位,而不是毫秒,因此您的查询必须非常慢才能在 2,000 秒(仅半小时多一点)的超时后生效。

JDBC 在其多个类中支持多种不同的超时。例如,javax.sql.DataSource 支持 .setLoginTimeout(也以秒为单位),java.sql.DriverManager 也是如此。

您还可以将特定于数据库的选项添加到连接字符串(您可以将其添加为“db-spec”中的附加键/值对)以控制较低级别的超时。例如,MySQL 在连接字符串中支持connectionTimeoutsocketTimeout ——这两者都以毫秒 为单位。 clojure.java.jdbc 允许在您的“db-spec”哈希映射中分别提供 :connectTimeout:socketTimeout 键。

请注意,此时clojure.java.jdbc 被认为是“稳定的”,所有当前和未来的开发工作都集中在next.jdbc 上。 next.jdbc 使loginTimeout 的使用更容易,因为它直接对 JDBC 对象进行操作,因此整个 (Java) API 也可用。它还内置了对连接池的支持,总体而言,比clojure.java.jdbc 更简单、更快。

【讨论】:

  • 发现 :timeout 需要几秒钟后。 @Sean Corfield 感谢您提供详细信息。
【解决方案2】:

您可以在 mysql-select-queries 上利用 query-hint(以毫秒为单位的时间)

SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM t1 INNER JOIN t2 WHERE....

然后你可以包装你的查询:

(defn timed-query [db query t]
  (j/query db [(str (subs query 0 6)
                    (format " /*+ MAX_EXECUTION_TIME(%s) */ " t)
                    (subs query 7))]))

和测试:

(deftest test-query-timeout
  (is (thrown? Exception (timed-query db "select * from Employees where id>5" 1))))

您应该使用非常复杂的查询来处理 1 毫秒;

【讨论】:

    【解决方案3】:

    我想出了一个变通方法来测试它。由于我使用 postgres,我可以利用 select pg_sleep(time-in-seconds)

    我的测试看起来像

    (is (thrown-with-msg? PSQLException #"ERROR: canceling statement due to user request"
                              (fetch-or-save "select pg_sleep(3)")))
    

    【讨论】:

      猜你喜欢
      • 2016-02-09
      • 2014-09-24
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多