簡體   English   中英

JDBC Microsoft SQL超時未觸發

[英]JDBC Microsoft SQL timeout not fired

我正在使用sqljdbc4.jar通過wifi從我的應用程序連接到SQL Server。 連接工作正常並且也可以進行查詢,但是有時wifi掉線了,我需要做出反應-嘗試重新連接,然后通知用戶連接失敗。

問題是,即使我設置了查詢超時,在斷開連接的情況下執行也會掛起,並且不會觸發任何SqlTimeoutException

連接(刪除用戶名和psw):

SQLconnection = DriverManager.getConnection("jdbc:sqlserver://%address%;user=%UserName%;password=%password%;database=%db_name%");

SQLSelectStatement = SQLconnection.createStatement();
SQLSelectStatement.setQueryTimeout(2);

執行查詢:

String sql = "%my query%";
ResultSet rs;
try {
    rs = SQLSelectStatement.executeQuery(sql);
} catch (SQLException sqle) {
    ConnectSQL(); //try to connect again
    rs = SQLSelectStatement.executeQuery(sql);
}

如果該方法拋出SQLException ,我將通知用戶並繼續。 但是,即使在連接丟失的情況下,也永遠不會拋出異常。

我該怎么解決? 我嘗試在基於MSDN的連接字符串中設置lock-timeout和logintimeout,方法SQLconnection.setNetworkTimeout觸發錯誤(如果我理解正確,則不會在Microsoft驅動程序中實現)。

我能想到的最后一個解決方案是自行實現某種超時,該超時將在一定時間后停止查詢線程。 但是我不會重新發明輪子。

根據我的谷歌搜索和閱讀, setQueryTimeout僅用於限制查詢執行時間,而不用於檢測連接錯誤。

我發現這篇很棒的文章描述了JDBC驅動程序中的超時。 我所需要做的只是點擊socketTimeout ,MS JDBC驅動程序不支持。

我切換到jTDS驅動程序並稍微重寫了我的代碼。 現在它可以按我的預期工作了。

//initialize SQL connection
    try {
        Class.forName("net.sourceforge.jtds.jdbc.Driver");
    } catch (ClassNotFoundException ex) {
        Cls_log.LogError(ex);
    }

private void ConnectSQL() {
    try {
        String url = "jdbc:jtds:sqlserver://<ip_address>/<db_name>;instance=<SQLserver_name>;loginTimeout=5;socketTimeout=2";
        SQLconnection = DriverManager.getConnection(url, <userName>, <password>);
        SQLSelectStatement = SQLconnection.createStatement();
    } catch (SQLException ex) {
        Cls_log.LogError(ex);
    }
}

執行我的查詢

String sql = "%my query%";
ResultSet rs;
try {
    rs = SQLSelectStatement.executeQuery(sql);
} catch (SQLException sqle) {
    ConnectSQL(); //try to connect again
    rs = SQLSelectStatement.executeQuery(sql);
}

如果這引發SQLException,我將通知用戶並提供解決方法。

此外,最新的Microsoft驅動程序也支持它: https : //github.com/Microsoft/mssql-jdbc/pull/85/files

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM