java – 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();
在这里,如果任何对象无法持久/合并,您也可以回滚整个事务.
标签:openjpa,java,performance,mysql 来源: https://codeday.me/bug/20190826/1728557.html