繁体   English   中英

执行Statement.executeQuery()后如何处理Java冻结?

[英]How to handle Java freezing upon executing Statement.executeQuery()?

您好,我正在编写一个运行在Java中的应用程序,该应用程序通过JDBC与MySQL数据库进行通信。 我遇到的问题是,该应用程序是实时应用程序,与数据库的连接有时会发生故障是不可避免的。 这是代码的草图:

int result          = 0;
Statement st        = null;
ResultSet rs        = null;
System.out.println("Obatining reference to main connection");
Connection conne    = Main.connection;
try {
    System.out.println("In try");
    System.out.println("Creating statement");
    st = conne.createStatement();
    System.out.println("Obtaining result");
    rs = st.executeQuery("Properly constructed and tested sql query");
    rs.last();
    result = rs.getRow();
    System.out.println("Exiting try");
}catch(SQLException se){ 
    se.printStackTrace();
}finally{
    System.out.println("In finally");
    try { rs.close();    } catch (Exception e) { /* ignored */ }
    try { st.close();    } catch (Exception e) { /* ignored */ }
}
  return result;

打印获得结果后程序冻结。 如果连接处于活动状态,则一切运行正常,但我需要保护它免受数据库故障的影响。 我测试此方法的方式是在运行此方法之前立即断开与数据库的连接。不会引发异常,也不会生成错误。 一旦打印“获取结果”,程序便会挂起。 我希望有人知道从这种情况中恢复的方法吗? 再次,该应用程序可以完美运行,但是我需要能够从不可用的数据库中恢复。

更多信息:

断开连接是指我通过vpn连接到数据库并关闭vpn以使数据库不可用。

有人发布过SQL格式不正确的信息。 请允许我澄清一下,那不是实际的SQL语句。 我宁愿不输入实际的陈述,也不实际相关,因为任何有效的陈述都会产生相同的不良影响。

一种选择是使数据库在后台线程上工作。 这样就可以等待指定的时间,然后在时间到期时继续操作。

最简单的入门方法是使用ExecutorService 您可以提交单个任务,并在返回的Future上等待特定的时间。 还检查出invokeAll方法和朋友。

您还可以尝试使用语句超时 ,尽管如果存在驱动程序错误或意外的通信问题(例如,执行速度很快但传输结果需要很长时间的查询),该语句超时可能比Executor方法更不可靠。

这是桌面应用程序还是Java EE应用程序?

如果是桌面应用程序,则可以尝试使数据库交互成为线程,并为其设置超时。

如果它是Java EE应用程序,并且您不愿意使用任何框架,则可以查看一些Transaction库,并对内部事务实施显式控制(例如向它们添加超时)。 起点: http//docstore.mik.ua/orelly/java-ent/ebeans/ch08_05.htm

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM