OpenJPA合并/持久化非常慢

我在带有MySQL 5.0 DB的WebSphere Application Server 8上使用OpenJPA 2.2.0。

我有一个对象列表,我想合并到数据库中。

就像是:

for (Object ob : list) { Long start = Calendar.getInstance().getTimeInMillis(); em = factory.createEntityManager(); em.getTransaction().begin(); em.merge(ob); em.getTransaction().commit(); em.close(); Long end = Calendar.getInstance().getTimeInMillis(); Long diff = end - start; LOGGER.info("Time: " + diff); } 

当我运行这个循环时,我需要大约300-600毫秒来合并一个对象。 当我删除行“em.merge(ob);”时 然后我需要“0”毫秒来迭代1个列表对象。

所以我的问题是:我可以做些什么来缩短合并一个对象的时间?

谢谢!

您可以尝试在迭代之前启动事务,然后在单个事务中提交事务。 所以,基本上你是在创建一个在提交时合并/持久化的批处理。

此外,您可以限制一次处理批处理中的对象数,并可以将更改显式刷新到数据库中。

在这里,您正在启动事务并在每次迭代中提交它,并且每次创建/关闭实体管理器都会影响大量数据的性能。

它将类似于下面的代码。

 em = factory.createEntityManager(); em.getTransaction().begin(); int i = 0; for (Object ob : list) { Long start = Calendar.getInstance().getTimeInMillis(); em.merge(ob); Long end = Calendar.getInstance().getTimeInMillis(); Long diff = end - start; LOGGER.info("Time: " + diff); /*BATCH_SIZE is the number of entities that will be persisted/merged at once */ if(i%BATCH_SIZE == 0){ em.flush(); em.clear(); } i++; } em.getTransaction().commit(); em.close(); 

在这里,如果任何对象无法持久/合并,您也可以回滚整个事务。