java - 未触发 JDBC Microsoft SQL 超时

标签 java sql-server jdbc

我正在使用sqljdbc4.jar 通过 wifi 从我的应用程序连接到 SQL Server。连接工作正常,也可以查询,但有时 wifi 掉线,我需要使用react - 尝试重新连接,然后通知用户连接失败。

问题是,即使我设置了查询超时,执行也会在断开连接的情况下挂起,并且不会触发 SqlTimeoutException

连接(删除用户名和密码):

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 在连接字符串中设置锁定超时和登录超时,方法 SQLconnection.setNetworkTimeout 也会触发错误(如果我理解正确,它未在 Microsoft 驱动程序中实现)。

我能想到的最后一个解决方案是自己实现某种超时,它会在一定时间后停止查询线程。但我不想重新发明轮子。

最佳答案

根据我的谷歌搜索和阅读,setQueryTimeout 仅用于限制查询执行时间,而不用于检测连接错误。

我找到了 this great article描述 JDBC 驱动程序中的超时。我所需要的只是点击 socketTimeout,这在 MS JDBC 驱动程序中不受支持。

我切换到jTDS driver并稍微重写了我的代码。现在它按我预期的那样工作。

//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,我会通知用户并提供解决方法。

关于java - 未触发 JDBC Microsoft SQL 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35439885/

相关文章:

c# - 在 SSIS 脚本任务中使用 c# 批量插入到 .CSV 目标文件

sql-server - 无法找到请求的.Net Framework 数据提供程序。它可能没有安装。 - 当遵循 mvc3 asp.net 教程时

sql-server - SQL性能: does MSSQL optimise the use of date time functions or is it better to pass it as a parameter

java - 使用 jdbc 时的日志记录问题

java - 无法对 PLSQL 语句执行 fetch : next

java - 从一个字符串中获取一个 double

java - WebApplicationInitializer 调用了两次

jdbc - Logstash:错误 org.postgres.Driver 未加载

java - @Temporal 优于@Column columnDefinition 吗?

java - 读取/写入/存储非常大的顺序数据集