我在做海量数据处理,要用到线程。业务大概是这样:先到db2数据库取数据(20万条),连接一直保持。数据取到rs中
(这样做的目的是:如果把数据全部放到集合会占用太多内存而且20w根本放不到一个集合中,最多只能放7w条左右,太多就会内存溢出),然后每1000条放到一个集合A中,把A中的数据先更新到sqlserver数据库,没有更新的数据再插入sqlserver数据库。更新插入完毕,清掉A中数据,继续添加1000条到A,再处理。直到20w条数据执行完毕。现在出现的问题是:
1.数据执行10小时左右就自动停止(我估计是rs的问题)
2.我想用线程,提高数据执行速度,但我不会线程,不知道用到那里合适。希望高手指点。万分感谢。注:数据处理方法有2个:一个update处理单条数据方法,还有一个update处理多条数据方法。把组织好的sql放入一个集合传给update多条处理方法,分解开再调用update单条数据方法。这样减少和数据库的连接次数)

解决方案 »

  1.   

    根据你对的描述,个人感觉,这里的业务或许是并行的两个系统的数据统合。处理这样海量数据的话,建议你改一下思路——放弃update和insert,改用delete和insert。
    大流程还是1000条一个单位来处理。但是,请先将sqlServer数据库该表中原先需要update的数据delete掉,然后统一insert。相信可以解决你的问题。
      

  2.   

    数据分页,
    开 [总数据量/一页数据量]+1 个线程 ,每个Thread负责把当前页的数据更新,或者再优化一下,每个线程处理多个叶面。开线程很简单
    new Thread() {
       public void run() {
          //数据库处理
       }
    }.start();外面套个循环就可以开多个了。因为数据不是相交的,没有什么需要同步的东西。
    关键是你的机器受不受得了,相当于一下子启动了很多很多程序,
    单cpu的多线程都是骗人的。
      

  3.   

    从db2中取出的数据导入到sqlserver中需要转换,例如:a代码要转化成“程序员”。
    所以不能使用迁移工具和导入导出功能。
    现在破在眉梢的问题是:程序执行10小时左右就不运行了。
    cpu占用率最高30%(包括其他程序),内存占用最多:700M左右。
    我估计是rs一直保持连接。时间长了,导致连接失效的原因。
    所以我想把数据全部先放到几个集合。关掉连接。测试过后发现不行。
    现在可以考虑用分批取数据的方法(分页算法)。
    主要还是想尝试用线程。
    高手给个demo。
      

  4.   

    另外备注:取出的20多万条数据没有重复的。根据一个唯一字段更新。
    插入的时候自动生成主键ID
    之所以先更新:是因为。更新返回值为0。则这条数据就可以立即插入。而且要计算出更新和插入的条数。
    先将sqlServer数据库该表中原先需要update的数据delete掉,然后统一insert
    这样做:首先就要确定那些要update.要做比较。速度比较慢
    如果直接更新。返回值为0插入。为1不插入。更新和插入一次性完成。速度比较快。
      

  5.   

    问题已经解决:
    采用分批取数据方案:从db2中取数据每次5万条到一个集合(因为集合中超过7万多条的时候会溢出),然后关掉连接(原来是连接一直开着)。把这个集合的数据循环,按1000条一个单位更新和插入到sqlserver。直到5w条完毕。再取5w条继续处理。直到20w数据处理完毕。
    在处理更新和插入的时候,开10个线程。每100条数据为一个线程单位,同时更新和插入。
    实际上采用的是分页、开线程的方法。