关于 java:Oracle 是否支持通过 JDBC 的服务器端可滚动游标?

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 驱动程序?

知道给定结果集长度的最快方法是什么??

提前致谢
伊斯梅尔


"知道给定结果集长度的最快方法是什么"
真正知道的唯一方法是把它们都数一遍。您想知道电话簿中有多少个"史密斯"。你数一数。
如果它是一个小的结果集,并且很快到达,那不是问题。 EG 电话簿中不会有很多甘道夫,无论如何你可能都想得到它们。

如果结果集很大,您也许可以进行估计,尽管 SQL 通常不是为此而精心设计的。

为了避免在客户端缓存整个结果集,可以尝试

1
select id, count(1) over () n from junk;

然后每一行将有一个额外的列(在本例中为 n),其中包含结果集中的行数。但是到达计数仍然需要相同的时间,因此超时的可能性仍然很大。

折衷方案是获取前一百(或一千)行,不要担心超出的分页。


您提出的带有计数的"解决方法"基本上是数据库服务器完成的工作的两倍。它必须首先遍历所有内容以计算结果数量,然后执行相同的返回结果。 Gary 提到的方法(count(*) over() - analytics)要好得多。但即使在这里,也必须在第一个输出返回给客户端之前创建整个结果集。因此,对于大型输出而言,内存消耗可能会很慢。

我认为最好的方法是在屏幕上只选择你想要的页面( 1 来确定下一个存在)例如从 21 到 41 的行。并且有另一个按钮(用例)在有人需要它的(罕见)情况下将它们全部计数。