如何优化在EJB(Oc4j)中运行的Oracle orderby本机查询的运行?

发布于 2024-10-21 07:49:58 字数 967 浏览 2 评论 0原文

我在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

转身以后 2024-10-28 07:49:58

提供了分页代码,可能对您有帮助。

em.createQuery("Select o from Entity o where o.id > :lastId order by o.id");
query.setParameter("lastId", previousResult.get(previousResult.size()-1).getId());
query.setMaxResults(10);

Provided code for pagination, might help you.

em.createQuery("Select o from Entity o where o.id > :lastId order by o.id");
query.setParameter("lastId", previousResult.get(previousResult.size()-1).getId());
query.setMaxResults(10);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文