【发布时间】:2019-01-11 12:57:58
【问题描述】:
我需要通过休眠使用 spring 数据来接收和保存大量数据。我们的服务器分配的 RAM 不足以同时保存所有实体。我们肯定会得到 OutOfMemory 错误。
所以我们需要分批保存数据,这是显而易见的。此外,我们需要使用@Transactional 来确保所有数据都持久化或非持久化,以防出现单个错误。
所以,问题是:@Transactional 方法期间的弹簧数据是否将实体存储在 RAM 中,或者垃圾收集器可以访问已刷新的实体?
那么,使用 Spring Data 处理大量数据的最佳方法是什么?也许弹簧数据不是解决此类问题的正确方法。
【问题讨论】:
-
在您的上下文中定义“巨大”?
-
数十万个可变大小的实体(10 kb - 2mb)
-
就像你说的你必须做批处理。 @Transactional 与批处理没有任何直接关系。有很多方法可以插入批次。但通常为整个记录集保持事务打开是一种不好的做法。您使用什么 DBMS?
-
DB2。因此,使用 2 阶段提交 - 似乎非常危险且难以实施。
-
在插入数十万个实体时,您真的想要全部还是全部?我的意思是使用一个总括交易?
标签: java spring hibernate spring-data transactional