我正在研究基于搜索的Java EE应用程序,它就像任何搜索引擎一样非常简单,一个页面允许用户搜索内容和分页以移动到下一组结果。现在我想提供功能导出文本文件中的数据,但问题是当要导出非常大的数据时,它消耗大约100MB的JVM内存。
Java EE专家请指教?
我看了here,但这对我没什么帮助
答案 0 :(得分:3)
您最有可能将整个数据保存在某种集合中,然后将其序列化为文本文件。正如您所注意到的那样,这可能适用于少量数据,但是当数据量太大时,您的应用程序就会瘫痪。在这种情况下,这不是一个好方法,因为你永远不会返回多少数据。
您应该将查询的结果流式传输到输出,即写入每个查询结果写入它,不需要临时保存它。您可以使用OutputStream的任何实现。如果要从servlet发送文件,则可能需要在设置正确的内容类型后直接写入servlet的输出流。
答案 1 :(得分:0)
每个会话100 MB,几乎没有同时用户。因此,您可以限制并发导出操作的数量,以确保不会耗尽内存;
有很多方法可以做到这一点,包括有限的Session EJB实例池(其他请求自动等待),相关类的静态变量中的计数器,数据库表(可以作为过去导出的日志加倍)操作),可能监视可用的内存。