首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MongoDB 4.0和SpringData中的事务

MongoDB 4.0和SpringData中的事务
EN

Stack Overflow用户
提问于 2018-07-19 18:11:36
回答 1查看 1.5K关注 0票数 1

我正在开发一个应用程序来读取只包含文本数据的文件。有时,该文件很小(约500 5bm~1mb),但有时文件大小可为5bm~20 1mb。我需要确保文件中的所有数据都存储在数据库中,以便事务进入。

文件的每一行表示将被验证和存储在该数据库中的信息。如果在此进程中发生错误,则事务将被中止。

我的文件导入过程需要如下:

导入函数

代码语言:javascript
运行
复制
@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

代码语言:javascript
运行
复制
@Document(collection = "ValidHeader")
public class ValidHeader {

    @Id
    private ObjectId id;

    @Enumerated(EnumType.STRING)
    private TipoRegistro tipoRegistro;

    private int pontoVenda;

    //Constructor & getters & setters

}

对于小文件,事务工作正常,但我的问题是大文件。

代码语言:javascript
运行
复制
org.springframework.data.mongodb.UncategorizedMongoDbException: Command failed with error 251 (NoSuchTransaction): 'Transaction 1 has been aborted.' on server localhost:27017.

但是调试时我意识到主要的问题是

代码语言:javascript
运行
复制
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将整个事务范围解释为一个单一的文档,它为什么要这样做?我该如何解决这些问题呢?

--辅助信息--

代码语言:javascript
运行
复制
SpringDataMongo: 2.1.0.M3
MongoJavaDriver: 3.8
HibernateOgmMongoDb: 5.3.1.Final
EN

回答 1

Stack Overflow用户

发布于 2018-07-19 19:57:39

我不理解MongoDB,但是为什么要坚持文件中的每一行呢?您能先读取整个文件,然后再坚持吗?现在您对每一行进行事务处理,这很可能是不对的。是的,一次内存中将有20 mb,但这就是为什么我们使用带有千兆字节内存的计算机。)如果您从内存中取出(例如,您有20个GB文件),那么您可以将它们分割成块并一个一个地保存它们。

只是看看这将如何影响您的代码首先使StringBuilder。然后,在你的同时,看看附加所有的行。过了一会儿,您的持久化数据库方法

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51429339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档