0

您好,我正在编写一个在 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 语句。我宁愿不把实际的陈述放进去,它实际上并不相关,因为任何有效的陈述都会产生同样的不良影响。

4

2 回答 2

0

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

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

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

于 2013-01-07T18:05:25.380 回答
0

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

如果它是一个桌面应用程序,您可以尝试让您的数据库交互成为一个线程,并为它们设置超时。

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

于 2013-01-07T18:08:50.930 回答