gpt4 book ai didi

java - MongoDB 4.0 和 Spring Data 中的事务

转载 作者:太空宇宙 更新时间:2023-11-04 10:18:25 33 4
gpt4 key购买 nike

我正在开发一个应用程序,该应用程序读取仅包含文本数据的文件。有时,此文件很小(大约 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,但这就是为什么我们使用具有 GB 内存的计算机。 :)如果内存不足,例如您有 20 GB 的文件,那么您可以将它们分割成 block ,然后将它们一一保存。

只是为了看看这将如何影响您的代码,首先创建 StringBuilder。然后在你的 while 中查看附加所有行。过了一会儿,你的方法就持久化到数据库了

关于java - MongoDB 4.0 和 Spring Data 中的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51429339/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com