2

我正在使用 jtds 1.2.7 驱动程序连接到 android 设备上的 sql server express 数据库。我故意将其设置为无法连接,因此我可以尝试设置自定义超时。但是,无论我尝试什么,超时总是需要 3 分钟。这是我用来打开连接的代码:

String connString = "jdbc:jtds:sqlserver://10.0.2.2:1433/Phone_Test;user=" + dUser + ";password=" + dPass + ";";

        //Calling instance of driver
        Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance();

        //Getting connection
        con = DriverManager.getConnection(connString, dUser, dPass);

设置我尝试使用的超时

DriverManager.setLoginTimeout(5);

在我尝试建立连接之前。我也尝试添加到连接字符串:

String connString = "jdbc:jtds:sqlserver://10.0.2.2:1433/Phone_Test;user=" + dUser + ";password=" + dPass + ";" + "loginTimeout=5;";

到目前为止没有任何效果。我在自定义异步任务中建立这个连接,所以也许更简单的方法是在任务上设置某种超时?我不想使用 .get() 方法,因为它会阻塞 UI 线程。有任何想法吗?

4

1 回答 1

0

我也从未解决过这个问题,但我确实有一个很好的解决方法。使用标准套接字代码,尝试绑定到数据库端口;超时在这里得到尊重。

我已经把它包装在一个方法中:

public static final String DATABASE_ADDR = "10.0.2.2";
public static final int DATABASE_PORT = 1433;
public static final int TIMEOUT_MS = 2000; // 2 seconds

.
.
.

public boolean serverAvailable() {
    // First check if we have network connectivity
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo == null) {
        return false;
    }

    // Attempt to bind to database port 
    boolean available = false;
    SocketAddress sockAddr = new InetSocketAddress(DATABASE_ADDR, DATABASE_PORT);
    Socket sock = new Socket();

    // On timeout, SocketTimeoutException is thrown.
    try {
        sock.connect(sockAddr, TIMEOUT_MS);
        available = true;
    } catch(Exception e){}
    finally {
        try{
            sock.close();
        } catch(Exception e2) {}
    }

    return available;
}

服务器可能会在运行此检查和连接到数据库之间的瞬间消失,但​​我可以忍受。

于 2014-02-26T14:53:10.950 回答