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();
在这里,如果任何对象无法持久/合并,您也可以回滚整个事务。
- 在JAVA中使用System.nanoTime()时,为什么要使用t1-t0 <0,而不是t1 <t0
- “在Java 8中构建时,未定义的引用:.. ConcurrentHashMap.keySet()”
- Apache Camel根据请求丰富了包含文件内容的消息
- 找到与输入和输出匹配的数学算法
- 类型中的方法不适用于参数
- BlockingQueue的drainTo()方法的线程安全性
- Java:String:equalsIgnoreCase vs将所有内容切换为大写/小写
- 怎么是x = 20; x = ++ x + ++ x + x ++; java中x的最终值是65
- 修改作为method-parameter传递的数组