ROW_NUMBER 函数与 Progress MongoDB JDBC 驱动程序

ROW_NUMBER function with Progress MongoDB JDBC driver

当我在我的 Java 程序中使用 Progress DataDirect MongoDB JDBC 大 table 驱动程序进行以下查询时,我遇到了内存问题] 在数据库中(4000 万条记录):

String query = "SELECT * FROM (SELECT tablename.*, ROW_NUMBER() OVER() AS rowid FROM tablename)";

如果我在数据库中有一个小的 table,上面的查询工作得很好。

如果我只是 运行 “SELECT ROW_NUMBER() OVER() AS rowid FROM tablename”,那么列的名称将变为空。好像AS里的语句没有效果:

Column Name: null class java.lang.Integer

Exception in thread "main" java.lang.NullPointerException

如果我只是 运行 “SELECT * FROM tablename”,那么获取 ResultSet 对象的速度非常快,我可以轻松读取 4000 万条记录不到几分钟。

那我错过了什么?我不知道如何正确使用 ROW_NUMBER 函数。任何想法?谢谢。

当尝试将所有这些(4000 万条)记录同时加载到 JVM 中时,您将得到 OutOfMemoryError(因为根据 -Xmx 设置,堆大小是有限的),所以最好实践不是一次加载所有记录,而是分批获取它们并分别处理每批记录。

在您的查询中,row_number() 没有列名,它只有一个标签(as 子句)。

幸运的是,JDBC 规范(第 15.2.3 节)要求您按标签而不是按名称检索列。 JDBC 中的列标签是 as 子句的值(如果指定)或原始列名。

您可以使用ResultSetMetaData.getColumnLabel()获取列标签。