我有一个应用程序,它将与MySQL Build 数据库连接并执行查询 . 有时 DriverManager.getConnection()
方法调用需要2秒,有时需要30秒 . 有没有办法在2秒后控制此方法超时?
DriverManager.setLoginTimeout()
似乎不起作用 .
实际上,我可以通过将线程休眠为超时值并在唤醒后关闭连接来设置 statement.executeQuery()
的超时 . 但它的连接 Build 部分我无法真正设置超时 .
非常感谢任何帮助 .
6 回答
如果没有其他选项,您可以始终只在一个单独的线程中执行调用,如果它在2秒内没有完成,您将中止/忽略该线程 .
EDIT 这是我的想法的一个例子:
然后,您可以在代码中的其他位置调用静态Dummy.getConnection()方法 . 一个缺点是这种方法总是花费2秒,但是当线程完成时将其更改为立即返回并不太难 .
您可以使用Java中的
ExecutorService
接口 . 以下是您需要做的样本 .尝试在连接URL或连接池上设置socketTimeout(以毫秒为单位的时间)(如果使用池) . 注意不要将此值设置得太低,否则会覆盖语句超时值 .
要么
设置此项修复了我的超时问题 .
以下是如何使用的示例:
http://www.javadocexamples.com/java/sql/DriverManager/setLoginTimeout%28int%20seconds%29.html
感谢codebolt,我不知道它是否是最好的解决方案,但这对我有用 . 10秒超时 .
电话:
我扩展了CodeBolt和anpadia的答案,以完成以下完整课程 . 它只有一个静态方法接受所有需要的连接参数,包括超时持续时间 . 此外,如果它们发生,该方法也会抛出SQLException和ClassNotFoundException .
用法:
以下是实施: