[英]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.