我写了个程序,每天根据一个报表的5w行数据更新数据库中的5w条记录,
目前的做法是 每读报表的一行,就用Hibernate load出一行数据,更改后再update到数据库中,执行速度是每秒20条数据,更新5w行记录耗时约40分钟
这个速度貌似不够快,估计主要是查询太耗时了——5w次搜索一个5w行记录的数据库表
现在我想一次把这5w行数据装载到HashMap中,这样也许就免去了这5w次IO操作有三个问题想请教大家——
1. 我这种方法是否合理?
2. 如何装载出这5w条数据?我用 Iterator it = session.createQuery("from Product p ").list().iterator(); 非常耗时,15分钟这条语句都没执行完成
3. HashMap能容纳下5w条记录吗?

解决方案 »

  1.   

    1、这种方法肯定不合理
    2、for each()循环
    3、HashMap可以容纳下5w条记录
      

  2.   

    只要你内存够大,是OK的
    不过一次装5W条没必要
      

  3.   

    有两种思路,主要是考虑一次load太多数据作循环的这样的性能问题。1 一次读取1000条去更新数据库
    2 2个线程线程,一个线程读取报表记录,一个线程根据报表记录回写数据库我倾向于选择方案2
      

  4.   

    朋友那样做很更慢的,您可以尝试20条或者50条数据再用Hibernate保存下,可能会好点,我们上W条的数据都是这样操作的
      

  5.   

    1、永远不要一次性把成万行记录搞到内存中,这是一个戒律
    2、这种事情最好就不要让HIBERNATE做,直接用JDBC
    3、硬要用HIBERNATE,那么最好分批进行
      

  6.   

    谢谢大家
    昨天后来发现,查询慢的原因是我的hql语句里用了左连接 Iterator it = session.createQuery("from Product p left join fectch .... ").list().iterator();
    改成 from Product p 就好了
    装载5w条记录的时间为81秒,遍历更新这5w条记录的时间为17秒(其实是少量更新,并不是5w条都更新)
    时间比原来的2400多秒提高了2个数量级但是,在家里的机器上试的时候就OutOfMemory了
    所以看来这种情况还是一块一块的加载吧
      

  7.   

    非常不合逻辑.你既然说是根据一个报表更新数据库,那为什么不一行一行读报表,然后一行一行更新到数据库中.
    我以前做过根据一个Txt文件更新数据库的程序.大概几千条数据,就用我上面的方法.基本上是秒级的就更新好了.
      

  8.   

    我用List放过60多万条记录。
    用过11000*11000的二维数组,再想搞个这么大的数组,就要经历漫长的等待
    还没找到少等点的解决方法
      

  9.   

    处理5万条hashmap。。速度会怎么样??
      

  10.   

    一次太多的数数据放在内存中,不会有堆溢出吗?以前试过用一个list来存放大数据就放不下了。
      

  11.   

    内存足够大,JVM堆栈足够大,就不会溢出,呵呵
    还是不要占太多内存的好
      

  12.   

    顶18楼
    1、永远不要一次性把成万行记录搞到内存中,这是一个戒律 
    2、这种事情最好就不要让HIBERNATE做,直接用JDBC 
    3、硬要用HIBERNATE,那么最好分批进行
      

  13.   

    Hibernate底层源码就是封闭了JDBC直接数据库存,加了一些优化的方式.但是操作大量的数据不适合选取.用存储过程proc性能较高,比较合适...
      

  14.   

    你可以扩大你的jvm内存来使内存容纳下更多的数据,比如-Xms64m -Xmx256m,最大256M