0

我正在尝试从 oracle 数据库表中爬取数据,并想要一个解决方案来为行创建检查点。

  • 基本上,爬虫最多爬500行,然后停止应用程序处理数据。2 分钟后,爬虫必须从最后一行(检查点)继续。

  • 目前,我正在使用带有 rownumber 的解决方案,但结果表明缺少某些行。

这可能是一个基本问题,但缺乏处理数据库的经验。我只是找不到可接受的解决方案。

4

1 回答 1

2

通常,您不会以这种方式设计系统。通常,您的应用程序会简单地打开一个游标,获取 500 行,在应用程序中处理这些行,获取接下来的 500 行,等等。只要您不关闭游标,Oracle 将继续返回系统的结果打开光标时更改编号 (SCN)。游标打开后添加的行不返回,游标打开后删除的行将返回。由于读取器不会阻止 Oracle 中的写入器,因此这种方法不会阻止任何其他应用程序使用该表(这在其他数据库中通常是一个问题)。

如果您真的想按照您描述的方式设计一个系统,您需要有一个列(或一组列),您可以一致地对其进行排序。这必须类似于单调递增的主键(例如,序列生成的主键)。然后你可以做类似的事情

SELECT *
  FROM( SELECT a.*,
               rownum rn
          FROM( SELECT *
                  FROM table_name
                 ORDER BY some_key ) a
         WHERE rownum <= MAX_ROW)
 WHERE rn >= MIN_ROW

当然,使用这种分页查询,当您接近表格的“末尾”时,您的过程将变得越来越慢。获取前 500 行将相当有效,因为您只需对前 500 行进行排序。当您获取第 9,500 到 10,000 行时,您将排序 20 倍的数据,因此查询可能会慢一个数量级。如果您的表很大,这通常会导致性能很差。您可以(稍微)通过在内部查询中添加翻转顺序的逻辑来提高性能,并在您获取一半页面后开始获取“早期”页面。

这种方法也可能会丢失行。例如,如果插入ID502 的事务提交,那么您获取第 501-550 行,然后插入“ID” 501 的事务提交,您将看到第 502 行,但看不到第 501 行。

于 2012-12-17T04:07:12.700 回答