[英]Transactions in MongoDB 4.0 and SpringData
我正在开发一个读取仅包含文本数据的文件的应用程序。 有时,此文件很小(大约500kb〜1mb),但有时文件大小可能是5bm〜20mb。 我需要确保文件中的所有数据都存储在数据库中,以便进行事务处理。
文件的每一行代表将被验证并存储在该数据库中的信息。 如果在此过程中发生错误,则事务将中止。
我的文件导入过程需要如下:
导入功能
@Transactional
public void importFile(MultipartFile multipartFile) throws IOException, IllegalAccessException, NoSuchFieldException {
try (BufferedReader file = new BufferedReader(new InputStreamReader(multipartFile.getInputStream()))) {
this.validateFile(file);
}
try (BufferedReader arquivo = new BufferedReader(new InputStreamReader(multipartFile.getInputStream()))) {
String line = file.readLine();
ValidHeader validHeader = this.validHeaderService.toParse(line.split(","));
this.validHeaderService.save(validHeader);
while ((line = file.readLine()) != null)
this.importFileContent(linha.split(",")); // -> This will validade and save others file content.
}
}
ValidHeader.java
@Document(collection = "ValidHeader")
public class ValidHeader {
@Id
private ObjectId id;
@Enumerated(EnumType.STRING)
private TipoRegistro tipoRegistro;
private int pontoVenda;
//Constructor & getters & setters
}
对于小文件,事务工作正常,但是我的问题是大文件。
org.springframework.data.mongodb.UncategorizedMongoDbException: Command failed with error 251 (NoSuchTransaction): 'Transaction 1 has been aborted.' on server localhost:27017.
但是调试后我意识到主要问题是
com.mongodb.MongoCommandException: Command failed with error 257 (TransactionTooLarge): 'Total size of all transaction operations must be less than 16793600. Actual size is 16794367' on server localhost:27017
据我了解,Mongo将整个交易范围解释为一个文档,为什么这样做呢? 以及如何解决这些问题?
-附加信息-
SpringDataMongo: 2.1.0.M3
MongoJavaDriver: 3.8
HibernateOgmMongoDb: 5.3.1.Final
我不了解MongoDB,但为什么要保留文件中的每一行? 您可以先读取整个文件,然后再将其保存吗? 现在您为每一行进行交易,这很可能是不正确的。 是的,您一次将拥有20 mb的内存,但这就是为什么我们使用的是千兆字节ram的计算机。 :)例如,如果内存不足,则有20 GB的文件,则可以将它们拆分为多个块,然后逐一保留。
只是为了了解这将如何影响您的代码,首先创建StringBuilder。 然后,在您的同时查看所有行。 片刻之后,您的持久化到数据库的方法
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.