现在要处理一个大概1000w条的表项,处理思路:
1.从表中以固定记录条数(如1000)读取数据作为一个处理单位,然后对这个单位进行处理。
2.java多线程。每个线程处理一个单位,并将该单位处理结果写入数据库。写入数据量大概为该处理单位数据量的10倍。
3.整个处理完后会产生1亿条数据出现的问题:运行过程中,内存使用量不断的上升,当处理的总数据量达到20000条的时候,总会出现内存溢出。自己的分析:线程运行完毕后,是不是该线程从mysql中读取的数据所占空间没有随着线程的结束而释放,从而使得主程序所占内存量不断的上升以至溢出。或者是其它的什么原因?请问大家这个问题可以怎么解决呀,求解决思路

解决方案 »

  1.   

    "从表中以固定记录条数(如1000)读取数据作为一个处理单位" 1000w条数据以1000为单位,需要1w个线程会疯掉的;
    最好可配置,一般线程数不超过10个为佳;
    现在的CPU是大部分是单核,多线程确实能提高并发,但提高性能不高;问题可能出现在:
    线程读取数据和写入数据库的连接存在等待,越来越多的等待造成数据没有释放;
      

  2.   

    另外要考虑每个线程使用的不是同一个数据库连接,如果是用spring管理的DAO类,需要将DAO改为非单一模式;数据库连接数确实要修改,像WAS默认的最大连接数是50个,如果存在并发,修改为50~80个(80个最大连接数),否则5个用户并发,就不能满足了;
      

  3.   

    另外请慎重使用synchronized关键字,一般情况是不需要使用的,只用在多个线程共同访问这个变量才需要;