将大量数据从Web服务导入MSSQL 2005的性能问题

时间:2011-10-18 08:17:50

标签: java sql-server performance jpa

我有一个程序,用于通过webservice(REST)将主表(大约20个)从Oracle复制/镜像到MSSQL 2005.

程序定期从webservice读取XML数据,并通过jpa实体将其转换为list。此实体列表将通过JPA存储到MSSQL。 所有jpa实体都将由创建Web服务的团队提供。

我注意到有两个问题,经过一些搜索后似乎无法解决。

第一期:通过JDBC jpa插入/更新的性能非常慢,每行需要大约0.1秒...... 通过C#做同样的事情 - >数据表 - > Bulkinsert到DB中的新表 - >调用存储过程基于连接进行批量插入/更新需要0.01秒才能获得4000条记录。 (每个表每5分钟会有大约500-5000条记录)

下面显示了执行任务的Java代码的快照 - >持久性库 - > EclipseLink JPA2.0

private void GetEntityA(OurClient client, EntityManager em, DBWriter dbWriter){        
//code to log time and others
  List<EntityA> response = client.findEntityA_XML();
  em.setFlushMode(FlushModeType.COMMIT);
  em.getTransaction().begin();
  int count = 0;
  for (EntityA object : response) {
    count++;
    em.merge(object);
    //Batch commit
    if (count % 1000 == 0){
      try{
        em.getTransaction().commit();
        em.getTransaction().begin();
        commitRecords = count;
      } catch (Exception e) {
        em.getTransaction().rollback();
      }
    }
  }
  try{
    em.getTransaction().commit();
  } catch (Exception e) {
    em.getTransaction().rollback();
  }
  //dbWriter write log to DB
}

任何做错都会导致缓慢?如何提高插入/更新速度?

第二期:有大约20个表要复制,我创建了与上面类似的相同数量的方法,基本上复制上面的方法20次并用EntityB替换EntityA等等,你得到这个想法......

有没有推广方法,以便我可以投入任何实体?

2 个答案:

答案 0 :(得分:0)

  

通过JDBC jpa插入/更新的性能非常慢,

OR映射器通常对于批量插入来说很慢。根据定义。你蚂蚁的速度?使用另一种方法。

一般情况下,ORM不会满足大量插入/存储过程方法的需要,并且在这里被屠宰。您使用错误的appraoch进行高性能插入。

  

有大约20个表要复制,我创建了相同数量的方法   上面,基本上复制上面的方法20次并用EntityB替换EntityA等等,你得到   这个想法......

泛型。 java的一部分现在已经有一段时间了。

答案 1 :(得分:0)

您也可以通过JPA执行SQL,存储过程或JPQL更新所有查询。我不确定这些对象来自何处,但如果您只是将一个表迁移到同一个数据库中的另一个表,那么您可以使用JPA在Java中用C#执行相同的操作。

如果要处理JPA中的对象,请参阅, http://java-persistence-performance.blogspot.com/2011/06/how-to-improve-jpa-performance-by-1825.html

对于#2,将EntityA更改为Object,并且您有一个通用方法。