OpenJPA合并/持久化非常慢

时间:2012-06-12 09:47:30

标签: java mysql performance 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个列表对象。

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

谢谢!

1 个答案:

答案 0 :(得分:6)

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

此外,您可以限制批处理中的对象数量,以便及时处理。可以将更改显式刷新到数据库中。

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

它将类似于以下代码。

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();

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