OpenJPA的合并/持续存在很慢(OpenJPA merging/persisting is ve

2019-06-25 10:27发布

我的WebSphere Application Server 8上使用OpenJPA的2.2.0与一个MySQL 5.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列出对象。

所以我的问题是:我能做些什么来改善合并一个对象的时候?

谢谢!

Answer 1:

您可以尝试开始迭代之前交易&然后在一个事务中之后commiting它。 所以,基本上你创建一个批处理这将合并/持续的承诺。

此外,您还可以限制对象的数量在一个批处理同时要处理和可以明确地刷新变为数据库。

在这里,你是发起交易和在每个迭代commiting它也创造/每次关闭实体管理器,会影响很多数据的表现。

它会像下面的代码。

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

在这里,你还可以,如果任何对象未能坚持/合并回滚整个事务。



文章来源: OpenJPA merging/persisting is very slow