如何优化在EJB(Oc4j)中运行的Oracle orderby本机查询的运行?
我在 EJB 和 Oracle 数据库方面遇到以下问题。
我在 Oc4j 中部署了一些本机 SQL 查询,它从 Oracle DB 返回超过 21k 行。当我对 Oracle DB 运行查询时,出现 JOOM(内存不足)异常。
而且因为要求包括结果集的分页,所以我们决定使用 em.setMaxResult、em.setFirstResult 一次只返回 10 行。
使用EntityManager
来实现分页给我们带来了一些问题,后来,需要对返回的结果进行排序,但整个结果不仅仅是setMaxResult()返回的10行
代码>!我们发现,在原生查询中放入ORDER BY xxxx
子句会使查询性能变得太差。
因此,我们正在考虑在数据库层进行分页(使用 Oracle rownum 或任何其他技术)。
后来,我们认识到,如果我们使用 em.clear()
我们也许可以通过以下方式避免 JOOM 异常:
define the result list
while database has more records
{
use entityManager get next 10 records and add them to the result list
entityManager.clear();
}
return result list
因此,我们可以在 Servlet 端实现分页(使用 session.getAttribute ("all_result").sublist(from, to)
) 因此我们可以使用 Java 进行排序,与 SQL 排序相反。
I've the following problem with EJB and Oracle database.
I've some native SQL query deployed in Oc4j that returns more than 21k rows from Oracle DB. when I run the query against Oracle DB I get JOOM (out of memory) exception.
And because the requirements was to include pagination for the result set, so we decided to use em.setMaxResult, em.setFirstResult to return only 10 rows a time.
Using the EntityManager
to implement the pagination put us in some problem As Later, it was required to sort the result returned, but the whole result not just the 10 rows returned by setMaxResult()
! We found that, to put the clause ORDER BY xxxx
in the native query makes the query performance became too bad.
So, we are considering doing the pagination in the Database layer (using Oracle rownum or any other technique).
Later, we recognized that, If we use em.clear()
we might be able to avoid the JOOM exception by making something like:
define the result list
while database has more records
{
use entityManager get next 10 records and add them to the result list
entityManager.clear();
}
return result list
So, we could implement the paging on the Servlet side (using session.getAttribute("all_result").sublist(from, to)
) and thus we can do the sort using Java as opposite to SQL sort.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
提供了分页代码,可能对您有帮助。
Provided code for pagination, might help you.