项目SSH架构,数据库mysql5,单表没有关联,没有建索引,表有10个字段。现在插入120W左右的List,很慢。每秒大概插入50条。这是BaseDao方法。
public List saveList(List list) {
this.getHibernateTemplate().saveOrUpdateAll(list);
return list;
}这是C3P0池配置

解决方案 »

  1.   

    saveOrUpdate会比较慢些,因为涉及到要做检查。楼主能否确认数据项绝无重复?如果能就直接用save吧。
      

  2.   


    我也尝试过save(),没有多少提升,治标不治本啊。
      

  3.   

    batch insert/update
    或者不用hibernate
    这玩意就是比普通的jdbc慢
      

  4.   


    我用PreparedStatement的时候,设置到200条executeBatch();
    然后我去查看数据库,以跟hibernate saveList()相同的速度写入数据。然后继续200-400,400-600.
    是我哪里设置的不对吗?
      

  5.   

    我查到了原因,我的autoCommit是true,相当于我的批处理都是无效的,实际上数据库还是一条一提交的插入。刚才浏览到一个帖子,用jdbc PreparedStatement 插入十万数据,5-6秒。
    而我修改后同样用PreparedStatement 十万数据要用20多秒。这是什么情况?
      

  6.   


    请教你个问题,如果我写存储过程交给数据库处理的话,想在有个疑问。这个存储过程不是需要传参数赋值吗?是不是我的dao层,要循环List,去调用存储过程。这样岂不是调用了很多次存储过程?速度能快吗?
    例如我的List有100条。调用了100次这个存储过程呀CREATE DEFINER=`root`@`localhost` PROCEDURE `pr_insertSea`(IN guid VARCHAR(64),IN datatime DATETIME,id3 DATETIME,id4 DOUBLE,id5 DOUBLE,id6 VARCHAR(16),id7 VARCHAR(16),id8 VARCHAR(16),id9 DOUBLE,id10 DOUBLE)
    BEGIN
    INSERT INTO sea VALUES (guid,datatime,id3,id4,id5,id6,id7,id8,id9,id10);
        END$$DELIMITER ;
      

  7.   

    可以给Oracle的存储过程传递 数组作为参数,不过也有点麻烦,具体可Google样例。