有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

db2 Java数据归档中的Oracle rownum

我有一个java数据归档过程,可以在db2和sybase之间移动数据。仅供参考-这不是通过任何导入/导出过程来完成的,因为每个表上都有几个在运行时可用的条件,所以这个过程是用java开发的

现在,我为每个源和目标组合定义了单个DatabaseReader和DatabaseWriter,以便在多个线程中移动数据。我想我想进一步扩展它,可以为每个源和目标组合定义多个DatabaseReader和多个DatabaseWriter

例如,如果源数据约为100行,我定义了10个读卡器和10个写卡器,那么每个读卡器将读取10行并将它们交给写卡器。我希望这个进程能根据服务器上可用的资源(CPU、内存等)给我带来极高的性能

但我想问题是这些源表没有主键,而且很难在多个集中获取行

Oracle提供了rownum的概念,我想那里的生活要简单得多。。。。但是db2呢?如何使用db2实现这种行为?有没有办法说先取前10条记录,然后取下10条记录,依此类推

有什么建议/想法吗

DB2Version-DB2V8。1.0.144 修复包数-16 Linux


共 (2) 个答案

  1. # 1 楼答案

    DB2确实支持rownum概念。由于不了解数据库架构,以下是一个示例:

    SELECT *
    FROM (
      SELECT rownumber() OVER (order by column1, column2) AS number, column1, column2
      FROM mytable
    ) temp
    WHERE number BETWEEN 20 AND 30
    

    这里的子查询获取表中的每一行,并根据指定的顺序分配rownumber函数。“外部”查询可以使用rownumber来选择实际需要用于批处理的行

  2. # 2 楼答案

    如果我理解正确的话,您只是尝试以10行为一批写入目标表。无需将读取分为10行

    只需启动select语句,然后继续读取,直到数据用完为止。 在每10行中,您可以调用writer。然而,大多数jdbc客户机都会在幕后执行这种优化,所以这可能并不比一次插入一行要好

    我怀疑nieve多线程实现是否会加快速度,因为目标数据库引擎无论如何都在做大部分工作,而且它会受到日志写入和锁定的限制,而多线程对此没有帮助(或更糟!)

    据我所知,一个简单的单线程“选择”/“插入”过程将很容易胜过多线程程序。还有其他方法可以优化这一点:-

    1. 调整数据库客户端,以便成批执行网络操作
    2. 检查“提交”处理,以便在大约每100次插入后提交一次