gpt4 book ai didi

java - Hibernate Cache1 OutOfMemory 与 OpenSessionInView

转载 作者:行者123 更新时间:2023-12-01 05:01:15 24 4
gpt4 key购买 nike

我有一个带有 Vehicle DTO 的 Vehicle 实体。

我将 OpenSessionInView 与 Stripes 一起使用。

在我的 Stripes action bean 中,我需要生成一个包含大约 50000 辆汽车数据的 csv。

因此,正如 Stripes 开发人员告诉我的那样,我使用以下方法将文件写入输出流:

StreamingResolution() {...}.stream(HttpServletResponse)

我有一项服务可以获取一些分页信息,加载一部分车辆并将它们转换为 DTO。

这些 dto 返回到 View 并写入 csv。

分页系统(每页 500 个项目)是为了避免有 50000 个 DTO 的列表和一些内存问题。

但它还不能完美地工作。使用 Jmap,我看到在 csv 进程结束时,堆空间中加载了超过 40000 辆车辆,但没有被垃圾收集。

使用 Yourkit 探查器,在我看来这些实体仍在 hibernate 的 L1 缓存中(在 StatefulPersistenceContext 中引用),并且由于我有 OpenSessionInView,我想问题是 session 有点长,需要清理缓存...

我只是想知道如何以一种优雅的方式做到这一点,因为我的 dao 方法加载车辆被许多服务使用,这些服务不一定需要清理/刷新 session 。

有人知道我能做什么吗?我想我可以在 DAO/Service 中创建一个方法来清除 session ,但它不是很优雅...

这是一个相当大的项目,我对它做了一个非常简单的描述。请不要告诉我不要使用 opensessioninview 或类似的东西,这不是我的决定......;)

最佳答案

这可能并不优雅,但在这种情况下,从 session 中驱逐实体是唯一可行的解​​决方案。

例如,将实体的数据写入输出流后,调用 session.evict(entity) 将其从 session 缓存中删除。或者,在每个“页面”的末尾调用它。

分页机制和逐出的结合应该确保缓存中的实体不会同时超过 500 个。

关于java - Hibernate Cache1 OutOfMemory 与 OpenSessionInView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4758574/

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