主要实现的功能是这样的:
我想实现一个上传EXCEL的功能,该功能主要分3部分:
1,上传EXCEL文件到指定的文件夹
2,然后读取该EXCEL文件内容
3,最后把EXCEL内容插入到数据库。
现在的问题是当EXCEL里的数据达到上万条的时候,插入到
数据库非常慢,一共花了5分多钟时间,我想问下有没有优化的
办法?请高手指点~

解决方案 »

  1.   

    批量插入的话用saveOrUpdateAll(Collection entities)方法
      

  2.   

    要注意控制一下一级缓存,帮助里有这样一段话如果要将很多对象持久化,你必须通过经常的调用 flush() 以及稍后调用 clear() 来控制第一级缓存的大小。 Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
       
    for ( int i=0; i<100000; i++ ) {
        Customer customer = new Customer(.....);
        session.save(customer);
        if ( i % 20 == 0 ) { //20, same as the JDBC batch size //20,与JDBC批量设置相同
            //flush a batch of inserts and release memory:
            //将本批插入的对象立即写入数据库并释放内存
            session.flush();
            session.clear();
        }
    }
       
    tx.commit();
    session.close();
      

  3.   

    加个配置:<property name="hibernate.jdbc.batch_size">批的大小。</property>代码类似于4楼。
      

  4.   

    Session session = sessionFactory.openSession(); 
    Transaction tx = session.beginTransaction(); 
      
    for ( int i=0; i <100000; i++ ) { 
        Customer customer = new Customer(.....); 
        session.save(customer); 
        if ( i % 200 == 0 ) { //200, same as the JDBC batch size //200,与JDBC批量设置相同 
            //flush a batch of inserts and release memory: 
            //将本批插入的对象立即写入数据库并释放内存 
            session.flush(); 
            session.clear(); 
        } 

      
    tx.commit(); 
    session.close(); 
      

  5.   

    你一次上传这么多的数据
    速度慢一点是正常的
    总不能像插入一条数据那么快吧
    如果数据的实时性要求的不高的话
    可以使用jms发送消息
    让它自己写入吧