1

由于 OOM 错误,我收到PersistenceException异常。

Exception in thread "Thread-7" java.lang.OutOfMemoryError: GC overhead limit exceeded
        at java.util.Arrays.copyOf(Arrays.java:2271)
        at java.lang.StringCoding.safeTrim(StringCoding.java:79)
        at java.lang.StringCoding.access$300(StringCoding.java:50)
        at java.lang.StringCoding$StringEncoder.encode(StringCoding.java:305)
        at java.lang.StringCoding.encode(StringCoding.java:344)
        at java.lang.String.getBytes(String.java:916)Heap dump file created [464734012 bytes in 39.704 secs]

我正在尝试处理具有 80-100k 行的文件。每行将作为一行存储在表中。每行大约有 15-20 个属性。我想了解数据库事务(@Transactional)需要多少内存才能将它们保存在实体管理器中并一次性持久化它们?由于我们的架构设计限制,批处理是不可行的。

请帮忙。

4

2 回答 2

1

如果您逐行阅读并收到此错误,我遇到了类似的问题。我们必须处理大文件,并且没有刷新缓存。我忘记了,我已经很久没有使用它了,ORM 处于休眠状态,我们不得不在实体管理器上添加刷新或清除调用(您还需要确保您没有在单笔交易,也会导致OOM)。当我发现插入一直填充缓存直到您获得 OOM 时,我感到很惊讶。

于 2013-08-14T20:54:38.373 回答
0

您可以发布您用来检查测试文件并将每一行保存到数据库表中的一行的代码片段吗?

于 2013-08-14T20:19:56.380 回答