如何强制超时为DriverManager.getConnection()方法调用?

iha*_*obs 8 java timeout database-connection

我有一个应用程序,它将与MySQL建立数据库连接并执行查询.有时DriverManager.getConnection()方法调用需要2秒,有时需要30秒.有没有办法在2秒后控制此方法超时?

DriverManager.setLoginTimeout() 似乎不起作用.

实际上,我可以statement.executeQuery()通过将线程休眠为超时值并在唤醒后关闭连接来设置超时.但它的连接建立部分我无法真正设置超时.

非常感谢任何帮助.

Run*_*odt 5

如果没有其他选择,则始终可以在单独的线程中执行调用,如果调用在2秒钟内未完成,则您将中止/忽略该调用。

编辑 这是我在想的一个例子:

public class Dummy extends Thread {
private volatile Connection conn = null;
@Override
public void run() {
    try {
        this.conn = DriverManager.getConnection("foobar") ;
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
static public Connection getConnection() {
    Dummy d = new Dummy() ;
    d.start() ;
    try {
        Thread.sleep(2000) ;
    } catch (InterruptedException e) {}
    return d.conn ;
}
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在代码的其他位置调用静态Dummy.getConnection()方法。一个缺点是该方法将始终花费2秒钟,但是将其更改为在线程完成后立即返回并不难。