java—如何在jdbc调用mysql数据库时指定毫秒超时?

kcwpcxri  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(349)

在开发快速mysql java应用程序时,如何在执行以下操作时以毫秒为单位指定超时:
从连接池获取连接
执行查询
我在mysql文档中找不到关于connector/j连接池的答案(1)。
我确实在tomcat的连接池中找到了maxwait连接池属性,它允许指定以毫秒为单位的超时作为池属性。如果getconnection操作花费的时间超过maxwait时间,则会引发超时异常。
对于我的第一个要求,使用tomcat连接池是唯一的选择吗?
关于指定查询超时的第二个要求,jdbc文档在statement对象上有setquerytimeout方法。但它采用以秒为单位的超时值(整数值)。如何满足以毫秒为单位指定超时的要求?

qeeaahzv

qeeaahzv1#

如果您的库没有对超时的内置支持,则始终可以使用 ExecutorService 和一个 Future 要模拟超时:

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 或者查询),但您可以在设置的时间内对用户/呼叫者做出响应。

相关问题