要把list中的数据,插入到数据库表中,
list包含有几万条数据,如果一次处理的话,页面提交就没响应了,基本就死了
请问,有什么处理方法呢?
数据库是mysql
而如果是把数据库表A的数据导到表B,也可能几万条数据,又可以怎么处理呢?

解决方案 »

  1.   

    能不能给用户个有好提示?
    比如用ajax异步提交。
    提交后,然后弹出一个层,数据正在提交过程中,请稍后。
    如果处理完成后,返回一个状态码。如果成功,则隐藏层。如果失败。提示错误就行了。
      

  2.   

    而如果是把数据库表A的数据导到表B,也可能几万条数据,又可以怎么处理呢?这个可以发送 sql语句,就交给数据库去处理吧
      

  3.   

    分批导入,一次导入1000条
    addBatch
      

  4.   

    这里API和源码例子
    一个英文的,一个翻译的:
    http://apicode.gicp.net/class.do?api=selectByfatherIndex&father=255
    http://apicodecn.gicp.net/class.do?api=selectByfatherIndex&father=255
      

  5.   

    感觉这个也不靠谱 几万条数据 估计要一直显示 “数据正在提交过程中,请稍后。”
    我的思路
    1是把list中的数据写入文件 然后通过后台线程去执行LOAD DATA LOCAL INFILE "D:\SQL.txt" INTO TABLE tb; 效率和效果应该还不错
    2数据库读写分离策略 具体可以去网上搜索
      

  6.   

    后台做控制,当数据达到一定条数时commit一次。
      

  7.   

    1)插入几万条也会死,这个只能说是你的代码没优化。曾经处理过EXCEL数据上传,每个报表15k行以上,近20列。一次性上传40多个。算算也有60多万条,100多MB。包括网传(intranet,时间忽略不计)、POI解析EXCEL、存入数据库,所有流程加起来不超过5分钟。服务器一般,2G内存,intel 2核cpu。也是mysql
    持久层:hibernate核心代码:用好jdbc的batch操作。
    for(...){
       session.saveOrUpdate(obj);
       if(i%20 == 0){
          session.flush();  //同步到数据库
          session.clear();  //及时清空缓存
       }
       i++;
    }
    tx.commit();这样搞不信你还会挂机2) A数据导入B数据
    mysql的sql:
    select * from a into b要求:a和b的字段一一对应。你也可以这样:
    create table b as select * from a
    要求:B不存在。这样创建了A的一个副本表,字段、数据全部相同,但是会丢失A的所有键,包括主键,外键,index
      

  8.   

    处理的过程无论如何都是很耗费时间的,加个友好的用户提示吧,就像楼上说的,用点ajax的技巧
      

  9.   

    解决方法很多,用ajax提示,或者后台处理,批量插入达到一定数量就要commit
      

  10.   

    几万条数据对数据而言不是问题,但是数据会越来越多,而且放到list里面不是一个很好的想法,会很占内存的,数据到达一定数量服务器死掉太正常了!用sql语句让数据库执行吧,应该快一些!
    如果是批量导入的话,以excel的形式上传附件的形式,在写一个批处理,在固定的时间自动执行入库操作。
      

  11.   

    不是特别清楚你的问题……
    只是从你的描述中,发现跟我前几天做的系统用户数据初始化类似,当时我的数据是1万7千多,是一个企业内部一个省的所有用户数据,我用的是db2数据库,且是从excel导入到数据库的操作。
    你现在的问题可能是一个几万级的list,已经在页面上了,你是想把这个list的所有数据插入数据库?
    这个肯定要考虑的一是执行特定数量(50-100)的插入,执行con.commit()操作,其二就是页面的操作,需要给出数据操作中的友好提示信息给用户,防止用户重复提交等操作。
    mysql的效率,几万行数据不是问题吧,当然也得看你要插入的数据复杂度等问题。
    这个还是有待考虑的,总感觉对你的问题不是太清楚,所以就不多说了。第二个问题,两个表之间的数据copy?这个不难吧,可以程序实现,也可以sql实现。
    期待详细的操作需求……
      

  12.   

    第二个问题,两个表之间的数据copy?这个不难吧,可以程序实现,也可以sql实现。
    期待详细的操作需求……
      

  13.   

    使用SQL提供的批处理操作,不行吗?
      

  14.   

    15楼说的感觉挺靠谱,学习ING
      

  15.   


    for(int i=0;<1000000;i++){
      session.saveOrUpdate(obj);
      if(i%20 == 0){
      session.flush(); //同步到数据库
      session.clear(); //及时清空缓存
      }
      i++;
    }
    tx.commit();
    Hibernate 得可以分批处理,一般情况,如果是Hibernate海量数据提交的话,是Hibernate的瓶颈。。
      

  16.   

    batch insert Hibernate的话,每一百条时清空一下Session,让其强制更新到数据JDBC的话,循环就可以了。内存够大就问题。
      

  17.   


    这个正解……我以前做ERP遇到过80多万条数据的导入,通过批处理,然后页面给个层和一个进度条,这样用户体验也比较好。
      

  18.   

    JDBC里有很多优化大数据量sql的方法,比如batch insert,prepareStatemet....要是用了这些优化还是觉得慢,写存储过程,总之在数据库层做这种优化比较好
      

  19.   

    请问LZ的这一个list是啥样的,能放这么多条数据?
      

  20.   

    我觉得还是这样做好些,要不的话就用sql,循环插入也用不了多久
      

  21.   

    个人观点,设计思路不对,B/S系统最忌讳的就是批量插入数据,像这种一次性插入几万条数据的系统就连C/S系统都无法解决,以前做过一个项目,是让用户一条一条的往数据库中插入,每插入一条以后页面接着跳转到插入界面,不会出现一次插入大批量数据的情况。
    至于必须大批量插入数据的时候专门做一个导入功能。
      

  22.   

    谁能给我写个批处理让我可以把SqlServer的tcpip打开并重启服务啊,电脑还原,每天都要去点,麻烦。
      

  23.   

    如果是 oracle数据库,可以先将list数据导出到txt,然后用 sql loader 读取 txt.用系统的任务计划后台导入数据库,这样就不会占用你应用程序的资源了。
      

  24.   

    addBatch数据多的时候也是个问题
    试试40楼的方法
      

  25.   

    能不能给用户个有好提示?
    比如用ajax异步提交。
    提交后,然后弹出一个层,数据正在提交过程中,请稍后。
    如果处理完成后,返回一个状态码。如果成功,则隐藏层。如果失败。提示错误就行了。
    这个靠谱啊!!
    引用楼上的写一个批处理。
      

  26.   

    你的业务逻辑肯定就有问题.怎么会在WEB程序的内存里保存着几万条数据呢?这样如果有系统错误不全丢了吗?你应该把这几万条数据保存到数据的一个临时表或中间表中,当要提交时,再移到另一个表中.