我有一个程序,用于通过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等等,你得到这个想法......
有没有推广方法,以便我可以投入任何实体?
答案 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,并且您有一个通用方法。