我在做海量数据处理,要用到线程。业务大概是这样:先到db2数据库取数据(20万条),连接一直保持。数据取到rs中
(这样做的目的是:如果把数据全部放到集合会占用太多内存而且20w根本放不到一个集合中,最多只能放7w条左右,太多就会内存溢出),然后每1000条放到一个集合A中,把A中的数据先更新到sqlserver数据库,没有更新的数据再插入sqlserver数据库。更新插入完毕,清掉A中数据,继续添加1000条到A,再处理。直到20w条数据执行完毕。现在出现的问题是:
1.数据执行10小时左右就自动停止(我估计是rs的问题)
2.我想用线程,提高数据执行速度,但我不会线程,不知道用到那里合适。希望高手指点。万分感谢。注:数据处理方法有2个:一个update处理单条数据方法,还有一个update处理多条数据方法。把组织好的sql放入一个集合传给update多条处理方法,分解开再调用update单条数据方法。这样减少和数据库的连接次数)
(这样做的目的是:如果把数据全部放到集合会占用太多内存而且20w根本放不到一个集合中,最多只能放7w条左右,太多就会内存溢出),然后每1000条放到一个集合A中,把A中的数据先更新到sqlserver数据库,没有更新的数据再插入sqlserver数据库。更新插入完毕,清掉A中数据,继续添加1000条到A,再处理。直到20w条数据执行完毕。现在出现的问题是:
1.数据执行10小时左右就自动停止(我估计是rs的问题)
2.我想用线程,提高数据执行速度,但我不会线程,不知道用到那里合适。希望高手指点。万分感谢。注:数据处理方法有2个:一个update处理单条数据方法,还有一个update处理多条数据方法。把组织好的sql放入一个集合传给update多条处理方法,分解开再调用update单条数据方法。这样减少和数据库的连接次数)
大流程还是1000条一个单位来处理。但是,请先将sqlServer数据库该表中原先需要update的数据delete掉,然后统一insert。相信可以解决你的问题。
开 [总数据量/一页数据量]+1 个线程 ,每个Thread负责把当前页的数据更新,或者再优化一下,每个线程处理多个叶面。开线程很简单
new Thread() {
public void run() {
//数据库处理
}
}.start();外面套个循环就可以开多个了。因为数据不是相交的,没有什么需要同步的东西。
关键是你的机器受不受得了,相当于一下子启动了很多很多程序,
单cpu的多线程都是骗人的。
所以不能使用迁移工具和导入导出功能。
现在破在眉梢的问题是:程序执行10小时左右就不运行了。
cpu占用率最高30%(包括其他程序),内存占用最多:700M左右。
我估计是rs一直保持连接。时间长了,导致连接失效的原因。
所以我想把数据全部先放到几个集合。关掉连接。测试过后发现不行。
现在可以考虑用分批取数据的方法(分页算法)。
主要还是想尝试用线程。
高手给个demo。
插入的时候自动生成主键ID
之所以先更新:是因为。更新返回值为0。则这条数据就可以立即插入。而且要计算出更新和插入的条数。
先将sqlServer数据库该表中原先需要update的数据delete掉,然后统一insert
这样做:首先就要确定那些要update.要做比较。速度比较慢
如果直接更新。返回值为0插入。为1不插入。更新和插入一次性完成。速度比较快。
采用分批取数据方案:从db2中取数据每次5万条到一个集合(因为集合中超过7万多条的时候会溢出),然后关掉连接(原来是连接一直开着)。把这个集合的数据循环,按1000条一个单位更新和插入到sqlserver。直到5w条完毕。再取5w条继续处理。直到20w数据处理完毕。
在处理更新和插入的时候,开10个线程。每100条数据为一个线程单位,同时更新和插入。
实际上采用的是分页、开线程的方法。