日期:2014-05-18  浏览次数:20803 次

关于海量数据处理和线程问题(在先等高手解决)
我在做海量数据处理,要用到线程。

业务大概是这样:先到db2数据库取数据(20万条),连接一直保持。数据取到rs中
(这样做的目的是:如果把数据全部放到集合会占用太多内存而且20w根本放不到一个集合中,最多只能放7w条左右,太多就会内存溢出),然后每1000条放到一个集合A中,把A中的数据先更新到sqlserver数据库,没有更新的数据再插入sqlserver数据库。更新插入完毕,清掉A中数据,继续添加1000条到A,再处理。直到20w条数据执行完毕。

现在出现的问题是:
1.数据执行10小时左右就自动停止(我估计是rs的问题)
2.我想用线程,提高数据执行速度,但我不会线程,不知道用到那里合适。希望高手指点。万分感谢。

注:数据处理方法有2个:一个update处理单条数据方法,还有一个update处理多条数据方法。把组织好的sql放入一个集合传给update多条处理方法,分解开再调用update单条数据方法。这样减少和数据库的连接次数)


------解决方案--------------------
目的是什么?
如果是要做数据迁移的话,应该用迁移工具和导入导出功能。
------解决方案--------------------
Servlet 本身就是一个线程
------解决方案--------------------

------解决方案--------------------
我个人认为,多线程在你那不太适用,如果对某条数据有多次更新就不能用了。这样非常容易出现死锁。
------解决方案--------------------
根据你对的描述,个人感觉,这里的业务或许是并行的两个系统的数据统合。处理这样海量数据的话,建议你改一下思路——放弃update和insert,改用delete和insert。
大流程还是1000条一个单位来处理。但是,请先将sqlServer数据库该表中原先需要update的数据delete掉,然后统一insert。相信可以解决你的问题。
------解决方案--------------------
数据分页,
开 [总数据量/一页数据量]+1 个线程 ,每个Thread负责把当前页的数据更新,或者再优化一下,每个线程处理多个叶面。

开线程很简单
new Thread() {
public void run() {
//数据库处理
}
}.start();

外面套个循环就可以开多个了。

因为数据不是相交的,没有什么需要同步的东西。
关键是你的机器受不受得了,相当于一下子启动了很多很多程序,
单cpu的多线程都是骗人的。
------解决方案--------------------
期待你的实验结果。
另外,如果是多线程的话,可能一次会申请很多数据库连接,这个要注意。
------解决方案--------------------
问一下,你检查了两边数据库连接池时间长度限制了吗?
------解决方案--------------------
可以考虑先把数据插到一个临时表,再用存储过程将临时表的数据更新至业务表
------解决方案--------------------
我觉得你的转移数据的思路就是不对的,要是数据有一千万条你也这么做吗?
合理的利用数据库本身的特性才是最好的,也是最高效的。
------解决方案--------------------
mark
------解决方案--------------------
每种数据库都是有快速复制的技术的,一般来说速度写入记录速度慢大概有下面几种情况:1、需要写入数据库日志;2、需要同步做索引;3、当然也有可能有其他的因素(同步备份机制或者是其他)

你要想加快速度可以做点优化是:使用数据库导入导出技术,记得不要写日志,那样会快很多
建立的表不要创建索引,也会加快速度,

导出数据时先写入到文件,记得是组织成导入数据库格式的文件,然后用导入数据库的命令直接导入这些文件就行了,速度很快的,

一个小时应该至少20万条,这是在正式的项目中测试过的,但是表有1。2亿条,大大超出想象。


其他的好方法,高手继续介绍学习