java - 如何在对 MySQL 数据库的 JDBC 调用中指定毫秒超时?
问题描述
在开发快速 MySQL Java 应用程序时,如何在执行以下操作时以毫秒为单位指定超时:
- 从连接池中获取连接
- 执行查询
我无法在关于使用 Connector/J 的连接池的 MySQL 文档中找到 (1) 的答案。
我确实在 Tomcat 的连接池中找到了maxWait连接池属性,它允许以毫秒为单位指定超时作为池属性。如果 getConnection 操作花费的时间超过 maxWait 时间,则会引发超时异常。
使用Tomcat 连接池是我第一个要求的唯一选择吗?
关于指定查询超时的第二个要求,JDBC 文档在 Statement 对象上有setQueryTimeout方法。但这需要以秒为单位的超时值(整数值)。如何满足我以毫秒为单位指定超时的要求?
解决方案
如果您的库没有对超时的内置支持,您始终可以使用 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
或查询),但您可以在设定的时间内响应您的用户/调用者。
推荐阅读
- cpython - CPython 是如何知道优化 (m**e)%n 的?
- redis - 按照 NoSQL 的建议重构 Redis 结构会记录单个键集对象吗?
- python - 如何解释二元神经网络结果?
- vim - 如何让 .vimrc 忽略反引号
- r - 圆形图中的比例
- javascript - 在 create-react-app 中添加一个单独的 HTML 文件
- ios - 表格视图单元格中未指定行数的标签的约束
- javascript - 等待不等待提交按钮
- python - String.split 在最后一个元素处停止 python
- c# - .NET 中定义的 char struct -- 运算符在哪里?