【发布时间】:2018-01-11 21:45:14
【问题描述】:
我有一个由 POJO 实现的实体,我们称它为 TestEntity,它保存在 Mongo 的 Collection 中。如果满足某些条件,我通过迭代 CSV 文件并插入或更新现有记录来生成此实体的实例。您可以在下面找到我的代码示例
// File is parsed into an entity
MongoClient client = new MongoClient("127.0.0.1", 27017);
Mapper w2sMap = new Mapper();
w2sMap.addMappedClass(TestEntity.class);
morphia = new Morphia();
Datastore datastore = morphia.createDatastore(client, w2sMap, "test");
// SaveTask implements Runnable
@Override
public void run() {
try {
datastore.save(testEntity);
} catch (DuplicateKeyException ex) {
if (updateConditions) // Query Mongo to find the entity, change some fields and save
else // Log
}
SaveTask 由 ExecutorService 由多个线程运行,每个线程保存一个 TestEntity 实例。然而,一些 CSV 文件非常庞大,必须执行许多 save 操作,这很麻烦(在我的机器上大约 10 分钟内执行了 750k 保存)。一种解决方案是将TestEntity 存储在Iterable 集合中并不时在集合上触发保存任务,从而减少网络延迟并提高性能(我实际的MongoDB 在不同的服务器上运行)
但是,当我尝试使用批量插入时,问题就出现了,因为当找到重复键时,我仍然会遇到异常。我知道new InsertOptions().continueOnError(true) 但是我需要能够一次性插入文档,这只会忽略重复的条目。
无论如何,我是否需要捕获异常,找出未保存的对象并从那里继续?如果需要,我可以提供更好的代码示例。
【问题讨论】:
标签: java mongodb import morphia upsert