首页 > 解决方案 > 如何在对 MySQL 数据库的 JDBC 调用中指定毫秒超时?

问题描述

在开发快速 MySQL Java 应用程序时,如何在执行以下操作时以毫秒为单位指定超时:

  1. 从连接池中获取连接
  2. 执行查询

我无法在关于使用 Connector/J 的连接池的 MySQL 文档中找到 (1) 的答案。

我确实在 Tomcat 的连接池中找到了maxWait连接池属性,它允许以毫秒为单位指定超时作为池属性。如果 getConnection 操作花费的时间超过 maxWait 时间,则会引发超时异常。

使用Tomcat 连接池是我第一个要求的唯一选择吗?

关于指定查询超时的第二个要求,JDBC 文档在 Statement 对象上有setQueryTimeout方法。但这需要以秒为单位的超时值(整数值)。如何满足我以毫秒为单位指定超时的要求?

标签: javamysqldatabasetomcatjdbc

解决方案


如果您的库没有对超时的内置支持,您始终可以使用 anExecutorService和 aFuture来模拟超时:

private ExecutorService executor = Executors.newCachedThreadPool();
private DataSource dataSource;

public void doSomething() throws InterruptedException, ExecutionException, TimeoutException, SQLException {
    Connection connection =
            executor.submit(() -> dataSource.getConnection()).get(400, TimeUnit.MILLISECONDS);
    try (Statement stmt = connection.createStatement()) {
        try (ResultSet resultSet = executor.submit(() -> stmt.executeQuery("SELECT * FROM blah"))
                .get(800, TimeUnit.MILLISECONDS)) {
            // Do something with result set
        }
    }
}

这将使线程池中的线程保持运行(尝试完成getConnection或查询),但您可以在设定的时间内响应您的用户/调用者。


推荐阅读