Dan*_*ask 0 java sql-server jdbc
我正在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);
Run Code Online (Sandbox Code Playgroud)
执行查询:
String sql = "%my query%";
ResultSet rs;
try {
rs = SQLSelectStatement.executeQuery(sql);
} catch (SQLException sqle) {
ConnectSQL(); //try to connect again
rs = SQLSelectStatement.executeQuery(sql);
}
Run Code Online (Sandbox Code Playgroud)
如果该方法抛出SQLException,我将通知用户并继续。但是,即使在连接丢失的情况下,也永远不会抛出异常。
我该怎么解决?我尝试在基于MSDN的连接字符串中设置lock-timeout和logintimeout ,方法SQLconnection.setNetworkTimeout也会触发错误(如果我理解正确,则不会在Microsoft驱动程序中实现)。
我能想到的最后一个解决方案是自行实现某种超时,该超时将在一定时间后停止查询线程。但是我不会重新发明轮子。
根据我的谷歌搜索和阅读,setQueryTimeout它仅对限制查询执行时间有用,而对检测连接错误不起作用。
我发现这篇很棒的文章描述了JDBC驱动程序中的超时。我所需要做的只是命中socketTimeoutMS 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);
}
}
Run Code Online (Sandbox Code Playgroud)
执行我的查询
String sql = "%my query%";
ResultSet rs;
try {
rs = SQLSelectStatement.executeQuery(sql);
} catch (SQLException sqle) {
ConnectSQL(); //try to connect again
rs = SQLSelectStatement.executeQuery(sql);
}
Run Code Online (Sandbox Code Playgroud)
如果这引发SQLException,我将通知用户并提供解决方法。
| 归档时间: |
|
| 查看次数: |
4427 次 |
| 最近记录: |