我为Java / JSF中的客户端编写了一个非常简单的报告,它基本上根据一些简单的搜索条件(开始和结束日期等)从mysql数据库中的表中返回行。这个数据库包含大量的行,但过去有一个限制,即只返回某种类型的行,这些行只占该表的1%左右。
最近,客户要求我在搜索条件中添加一个复选框,允许他们绕过对要返回的行的限制。如果您选中该框并保留较宽的日期范围,则可以尝试检索大量的ResultSet,然后将用户重定向到Glassfish错误页面,其中包含令人愉快的消息:java.lang.OutOfMemoryError:GC开销限制。
我发现的关于这个错误的帖子的每一个回复基本上都说“不要记住Out of Memory错误”,我明白了:你无法真正预测OOM错误会在哪里显现,即使你知道它在哪里造成的。
我想知道如何比使用Glassfish错误页面更优雅地处理它。理想情况下,我希望能够让用户回到搜索页面,并提供一条消息,告诉他们如果标准过于宽泛,就会缩小他们的标准。在内存不足之前有没有一种很好的方法呢?或者是对搜索结果设置任意限制的最佳解决方案(可能首先使用count()运行查询,如果返回的结果超过X,则返回搜索页面并显示错误消息?)
答案 0 :(得分:0)
我认为最好的方法是使用分页。用户真正可以在屏幕上看到多少记录?让我们说100。所以,你显示前100行和导航器到下一页100行。但是,当然,这取决于业务需求。
答案 1 :(得分:0)
对于无限大小的结果,您应该流式传输它们,而不是在发送之前尝试完整地渲染页面。
E.g。使用基于游标的方法并流式传输http输出。这样,服务器只需要保持有限的状态,最坏的情况是用户的浏览器由于页面较大而变得无法使用。