在读取大型结果集时从连接失败中恢复

时间:2014-01-31 10:38:44

标签: java sql oracle database-connection resultset

我正在从Java向Oracle数据库发送查询,并在ResultSet中获取结果:

ResultSet rset = null;
try{
    stmt = conn.createStatement();
    rset = stmt.executeQuery(query);
}
catch (Exception e){
    e.printStackTrace();
}

然后将结果写入文件:

while(rset.next()){
    for(int i=1;i<=columnCount;i++){
        out.append(rset.getString(i) + ";");
    }
    out.append(System.getProperty("line.separator"));
}

ResultSet很大。千兆字节。将所有这些数据导出到文件需要一段时间,但这不是问题。问题是与数据库的连接,一次又一次地丢失 - 而我仍在读取数据。我可以让我的代码重新连接并重新执行查询,我可以读取输出文件,看看我已经走了多远。

我剩下的问题是:到达ResultSet中的最佳方式是什么?

  • 做一会儿(rset.next())直到我在正确的行号?
  • 使用SELECT * FROM(...)WHERE rownum&gt;包围原始查询...?
  • 其他/更好的建议?

1 个答案:

答案 0 :(得分:0)

  

我剩下的问题是:到达ResultSet中的最佳方式是什么?

很难说最佳方式是什么。你需要尝试一种或多种方法,看看你是否对它们感到满意。

  

执行while(rset.next()),直到我找到正确的行号?

IMO这样效率不高,因为如果先前的尝试在第100行失败,则代码将需要在重新启动之前跳过1百万行。

  

使用SELECT * FROM(...)WHERE rownum&gt;包围原始查询...?

这个更有前途,因为您可以快速跳过已处理的行。 但是,您必须确保两次尝试之间行的顺序和行内容的顺序保持不变。

  

其他/更好的建议?

如何分割结果并将较小的部分分配给线程?