Does Oracle support Server-Side Scrollable Cursors via JDBC?
目前在部署基于 OFBiz 的 ERP,我们遇到了以下问题:框架的一些代码调用 resultSet.last() 来了解结果集的总行数。使用 Oracle JDBC Driver v11 和 v10,它会尝试缓存客户端内存中的所有行,导致 JVM 崩溃,因为它没有足够的堆空间。
经过研究,问题似乎是Oracle JDBC通过使用缓存在客户端而不是服务器中实现了可滚动光标。使用 datadirect 驱动程序,该问题得到解决,但似乎对 resultset.last() 的调用需要太多才能完成,因此应用程序服务器中止了事务
有什么方法可以在 oracle 中通过 jdbc 实现可滚动游标而不借助 datadirect 驱动程序?
知道给定结果集长度的最快方法是什么??
提前致谢
伊斯梅尔
- 我先问一个切题的问题;您是否同时需要数据和结果集的大小,或者您可以只执行 COUNT(*) 类型的查询来查找行数?你真的也需要行数吗,我见过太多次了,当程序确实不需要时,它会执行非常昂贵的操作来获取分页的总行数。
- 它需要确定分页方案中的页数。我们试图避免使用 last,并使用迭代器 next() 方法检查 null 来计算 currentIndex。有没有一种不使用 last() 方法就可以快速知道页数的方法。我们的解决方法是执行一个条件相同的COUNT查询,然后对数据执行查询
- 用户是否需要知道页数?是否存在用户想要直接转到最后一页的有效用户案例?我们通常只要求一个页面需要的更多条目,然后如果该条目存在,则为”下一页”页面添加一个链接 – 重新查询以获取下一页。假设您的数据具有某种可以排序的顺序。
- 我在这里举了一个在结果集中获取”总行数”的示例,并将结果集本身放在 Oracle 中的同一 SQL 查询中:stackoverflow.com/questions/2840/paging-sql-server-2005-resu??lts /…
“知道给定结果集长度的最快方法是什么”
真正知道的唯一方法是把它们都数一遍。您想知道电话簿中有多少个”史密斯”。你数一数。
如果它是一个小的结果集,并且很快到达,那不是问题。 EG 电话簿中不会有很多甘道夫,无论如何你可能都想得到它们。
如果结果集很大,您也许可以进行估计,尽管 SQL 通常不是为此而精心设计的。
为了避免在客户端缓存整个结果集,可以尝试
|
1
|
select id, count(1) over () n from junk;
|
然后每一行将有一个额外的列(在本例中为 n),其中包含结果集中的行数。但是到达计数仍然需要相同的时间,因此超时的可能性仍然很大。
折衷方案是获取前一百(或一千)行,不要担心超出的分页。
- 1:虽然很高兴知道查询将返回的行数,但必须计算此信息,因此会产生成本。加里的回答可能是最便宜的方法。
您提出的带有计数的”解决方法”基本上是数据库服务器完成的工作的两倍。它必须首先遍历所有内容以计算结果数量,然后执行相同的返回结果。 Gary 提到的方法(count(*) over() – analytics)要好得多。但即使在这里,也必须在第一个输出返回给客户端之前创建整个结果集。因此,对于大型输出而言,内存消耗可能会很慢。
我认为最好的方法是在屏幕上只选择你想要的页面( 1 来确定下一个存在)例如从 21 到 41 的行。并且有另一个按钮(用例)在有人需要它的(罕见)情况下将它们全部计数。
来源:https://www.codenong.com/1060545/
