java类CachedRowSetImpl的奇怪行为

java类CachedRowSetImpl的奇怪行为,java,postgresql,jdbc,cachedrowset,Java,Postgresql,Jdbc,Cachedrowset,在java中使用CachedRowSetImpl类非常困难。 我想分析一个巨大的postgres表的数据,该表包含约35000000行和3个整数列 我无法将所有内容都加载到我的计算机物理内存中,那么我希望每批100000行读取这些行。 在psql提示符或图形界面(如pgadmin)中执行相应的查询时,从表限制10000中选择col1、col2、col3,加载100000行和几兆内存大约需要4000ms 我尝试使用以下java代码执行相同的操作: CachedRowSet rowset = new

在java中使用CachedRowSetImpl类非常困难。 我想分析一个巨大的postgres表的数据,该表包含约35000000行和3个整数列

我无法将所有内容都加载到我的计算机物理内存中,那么我希望每批100000行读取这些行。 在psql提示符或图形界面(如pgadmin)中执行相应的查询时,从表限制10000中选择col1、col2、col3,加载100000行和几兆内存大约需要4000ms

我尝试使用以下java代码执行相同的操作:

CachedRowSet rowset = new CachedRowSetImpl();
int pageSize=1000000;
rowset.setCommand("select pk_lib_scaf_a,pk_lib_scaf_b,similarity_evalue from from_to_scaf");
rowset.setPageSize(pageSize);
rowset.setReadOnly(true);
rowset.setFetchSize(pageSize);
rowset.setFetchDirection(ResultSet.FETCH_FORWARD);
rowset.execute(myConnection);

System.out.println("start !");

while (rowset.nextPage()) {
    while (rowset.next()) {
        //treatment of current data page

    } // End of inner while
    rowset.release();
} 
运行上述代码时,启动!消息永远不会显示在控制台中,执行似乎卡在rowset.execute行中。 此外,内存消耗变得疯狂,达到了我的计算机物理内存8gb的极限

这很奇怪,看起来程序试图用~35000000行填充行集,而不考虑pageSize配置

有没有人在java JDBC和postgres驱动程序中遇到过这样的问题?我错过了什么

博士后9.1 Javadoc emphasis mine中的java jdk 1.7

CachedRowSet对象是一个断开连接的行集,这意味着它只短暂地使用到其数据源的连接。它在读取数据以填充行时连接到数据源,在将更改传播回其基础数据源时再次连接到数据源。其余时间,CachedRowSet对象断开连接,包括在修改其数据时

根据你的问题:

看起来程序试图用~35000000行填充行集,而不考虑pageSize配置

是的,CachedRowSet将立即从数据库中检索35m行,然后应用分页和其他定义的属性。一种可能的解决方案是将数据分块处理,并在每一行上设置一个标记,将其标记为已处理


我建议使用这样的ETL工具来处理此类问题。

事实上,游标的支持在postgres JDBC中是隐式编码的,如其文档中所述。但是,光标是在某些条件下自动创建的


好的,谢谢你提出了一个增量游标的想法。但是基本的jdbc jdk没有任何东西来处理这种情况?我的搜索没有成功,但它看起来像一个日常用例。无论如何,谢谢。