带有Progress MongoDB JDBC驱动程序的ROW_NUMBER函数

时间:2016-11-11 21:28:41

标签: java mongodb jdbc progress

当我在Java程序中使用Progress DataDirect MongoDB JDBC驱动程序在数据库中使用大表(4000万条记录)运行以下查询时出现内存问题:

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

如果我在数据库中有一个小表,上面的查询就可以正常工作。

如果我只运行“SELECT ROW_NUMBER()OVER()AS rowid FROM tablename”,那么列的名称将变为null。 AS似乎在声明中没有效果:

  

列名:null类java.lang.Integer

     

线程“main”中的异常java.lang.NullPointerException

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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