繁体   English   中英

MongoDB 4.0和SpringData中的事务

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM