Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有Progress MongoDB JDBC驱动程序的行数函数_Java_Mongodb_Jdbc_Progress - Fatal编程技术网

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

Java 带有Progress MongoDB JDBC驱动程序的行数函数,java,mongodb,jdbc,progress,Java,Mongodb,Jdbc,Progress,当我在Java程序中使用Progress DataDirect MongoDB JDBC驱动程序在数据库中的一个大表(4000万条记录)运行以下查询时,我遇到了内存问题: 如果我在数据库中有一个小表,上面的查询工作得非常好 如果我只是运行“SELECT ROW_NUMBER()OVER()作为tablename中的rowid”,那么列的名称将变为null。声明中的AS似乎无效: 列名:null类java.lang.Integer 线程“main”java.lang.NullPointerExce

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

如果我在数据库中有一个小表,上面的查询工作得非常好

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

列名:null类java.lang.Integer

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

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


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

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

当您尝试同时将所有(4000万)记录加载到JVM中时,您将得到
OutOfMemoryError
(因为堆大小是有限的,这取决于-Xmx设置),因此最好的做法不是一次加载所有记录,而是将它们作为批获取并分别处理每批记录

在您的查询中,
行\u number()
没有列名,它只有一个标签(
as
子句)

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


您可以使用
ResultSetMetaData.getColumnLabel()

获取列标签在查询中,
行号()
没有列名,它只有一个标签(as子句)

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


您可以通过使用
ResultSetMetaData.getColumnLabel()

获取列标签。读取4000万条记录后的目标是什么?要求我的库将带有rowid的ResultSet对象传递到另一个应用程序,以便他们可以对记录执行任何操作。名称应为“rowid”因为库还支持其他不同的数据库。我们不使用ResultSet.getInt(index)来获取数字,而是将其命名为ResultSet.getString(“rowid”)。我想我可以强制把它放在开头或结尾,但我认为这不是一个好主意。你读了我的答案了吗,为什么不能分批读呢?你的列名为空的问题不是问题。该列没有名称,只有一个标签(as子句),因此应该使用列标签。如果您不能通过标签检索,那么这是驱动程序中的一个错误。读取4000万条记录后的目标是什么?要求我的库将带有rowid的ResultSet对象传递到另一个应用程序,以便他们可以对记录执行任何操作。名称应为“rowid”因为库还支持其他不同的数据库。我们不使用ResultSet.getInt(index)来获取数字,而是将其命名为ResultSet.getString(“rowid”)。我想我可以强制把它放在开头或结尾,但我认为这不是一个好主意。你读了我的答案了吗,为什么不能分批读呢?你的列名为空的问题不是问题。该列没有名称,只有一个标签(as子句),因此应该使用列标签。如果您不能通过标签检索它,那么它是驱动程序中的一个错误。不,当我执行查询时,如果没有在开始处添加“SELECT*FROM”(“SELECT*FROM”)它不会给我错误。如果我只是运行“SELECT tablename.*,ROW_NUMBER()OVER()作为来自tablename的rowid”,它立即返回ResultSet。但是,名称将变为null,我只能使用ResultSet.getInt(索引)获取行号。如果我运行“SELECT*FROM tablename”获取4000万条记录,我可以在不到几分钟的时间内使用ResultSet.next()完成所有记录的读取。因此,“SELECT*FROM(SELECT tablename.*,row_number()OVER())作为tablename中的rowid)“仅适用于小数据集。和“选择tablename.*,ROW_NUMBER()OVER()作为tablename中的rowid”工作正常,但名称变为空。我认为这可能是驱动程序问题,因此我联系progress解决此问题。我只想看看是否有人知道任何事情…不,当我执行查询时,如果没有在开始时添加“SELECT*FROM”(“SELECT*FROM”)它不会给我错误。如果我只是运行“SELECT tablename.*,则ROW_NUMBER()OVER()作为rowid FROM tablename”,它立即返回ResultSet。但是,名称将变为null,我只能使用ResultSet.getInt(索引)获取行号。如果我运行“SELECT*FROM tablename”获取4000万条记录,我可以在不到几分钟的时间内使用ResultSet.next()完成所有记录的读取。因此,“SELECT*FROM(SELECT tablename.*,row_number()OVER())“作为tablename中的rowid)”有效,但仅适用于小数据集。而“选择tablename.*,作为tablename中的rowid的ROW_NUMBER()OVER()”有效,但名称变为空。我认为这可能是驱动程序问题,所以我联系progress解决此问题。我只想看看是否有人知道任何事情……再次感谢您。再次感谢您。
String query = "SELECT * FROM (SELECT tablename.*, ROW_NUMBER() OVER() AS rowid FROM tablename)";