我在带有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();
在这里,如果任何对象无法持久/合并,您还可以回滚整个事务。
问题内容: 到目前为止,我的偏好是始终使用EntityManager 来处理插入和更新。但是我还注意到,合并会在更新/插入之前执行其他选择查询,以确保数据库中不存在记录。 现在,我正在一个需要对数据库进行大量(批量)插入的项目。从性能的角度来看,在我绝对知道我一直在创建要持久化的对象的新实例的情况下,使用持久化而不是合并有意义吗? 问题答案: 它不是用一个好主意时,就足够了- 做了很多更多的工作。
Akka持久化使有状态的actor能留存其内部状态,以便在因JVM崩溃、监管者引起,或在集群中迁移导致的actor启动、重启时恢复它。Akka持久化背后的关键概念是持久化的只是一个actor的内部状态的的变化,而不是直接持久化其当前状态 (除了可选的快照)。这些更改永远只能被附加到存储,没什么是可变的,这使得高事务处理率和高效复制成为可能。有状态actor通过重放保存的变化来恢复,从而使它们可以重
Hy全部 我很难解决次年Spring的jpa问题。假设我有以下简单的数据模型(两个实体之间有单向关系) 和下面的管道来存储它们 下面的测试 最后一次测试(即insertEntity2WithExistingEntity1)失败,出现以下异常 组织。冬眠PersistentObjectException:传递给persist:com的分离实体。实例杰帕德莫。实体1 如果我将Entity2中的Casc
(译 者注:在阅读本章的时候,以后整个手册的阅读过程中,我们都会面临一个名词方面的问题,那就是“集合”。"Collections" 和 "Set" 在中文里对应都被翻译为“集合”,但是他们的含义很不一样。Collections 是一个超集,Set 是其中的一种。大部分情况下,本译稿中泛指的未加英文注明的“集合”,都应当理解为“Collections”。在有些二者同时出现,可能造成混淆的地 方,我们
Spark通过在操作中将其持久保存在内存中,提供了一种处理数据集的便捷方式。在持久化RDD的同时,每个节点都存储它在内存中计算的任何分区。也可以在该数据集的其他任务中重用它们。 我们可以使用或方法来标记要保留的RDD。Spark的缓存是容错的。在任何情况下,如果RDD的分区丢失,它将使用最初创建它的转换自动重新计算。 存在可用于存储持久RDD的不同存储级别。通过将对象(Scala,Java,Pyt