我刚刚开始做一些Java EE项目,我正在尝试更新现有的自动完成字段。我正在使用Primeface for JSF,我正在使用JPA。
我的自动完成工作正常。我现在的问题是记录已经增长到一百万,而且由于生成了大量的List,我现在的代码现在产生了内存/堆空间不足的问题。
我使用@Startup在ejb上生成List,因为数据没有改变。当我们直接向数据库添加更多数据时,它通常会增长。此外,当我尝试使用@Postconstruct将其加载到Managed Bean时,我会更快地获得内存不足。
我正在使用它填充ejb中的列表
private List<TranslationAutoComplete> translations;
this.translations = em.createQuery("SELECT NEW com.sample.model.TranslationAutoComplete(t.id, t.entry) FROM Translation t ORDER BY t.entry ASC", TranslationAutoComplete.class).getResultList();
有没有什么比这更好的结构可以有效地处理这个而不会产生一些内存/堆空间问题?我读过Memcache?和其他非Java核心Collections但还没有尝试过。这些是更好的解决方案吗?或者在Java EE中有更有效的方法。
答案 0 :(得分:0)
您必须限制查询结果。您可以使用Query的setMaxResults(int maxResults)
来实现此目的。如果你这样做:
this.translations = em
.createQuery("SELECT NEW com.sample.model.TranslationAutoComplete(t.id, t.entry)
FROM Translation t ORDER BY t.entry ASC", TranslationAutoComplete.class)
.setMaxResults(10).getResultList();
您将只获得10个结果。如果用户不断在自动填充中输入数据,则会显示更多结果,从而提高效率。欢呼声。
答案 1 :(得分:0)
首先,浏览Jprofiler
并检查哪些特定数据是outOfMemoryException
的原因。有些其他Objects
类似的连接可能占用大量内存资源。
大数据真的像托管bean的定时炸弹。因为我更喜欢在最初的@Postconstruct
列表中仅加载固定的记录限制,并在不同的服务请求中获取所需的记录(如果有数百万条记录)。
您还可以增加应用程序服务器的运行时内存空间,但这不符合逻辑,也不是处理此问题的好方法。