簡體   English   中英

Java類CachedRowSetImpl的奇怪行為

[英]Strange behavior for java class CachedRowSetImpl

我很難在java中使用CachedRowSetImpl類。 我想分析一個巨大的postgres表的數據,它包含~35,000,000行和3個整數列。

我無法將所有內容加載到我的計算機物理內存中,然后我想每批100000行讀取這些行。 在psql提示符或pgadmin等圖形界面中執行相應的查詢(從表限制10000中選擇col1,col2,col3)時,需要大約4000ms來加載100000行和幾兆字節的內存。

我嘗試使用以下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)的極限。

這很奇怪,看起來程序試圖用~35,000,000行填充行集,而不考慮pageSize配置。

有沒有人遇到過java JDBC和postgres驅動程序這樣的問題? 我錯過了什么?

postgres 9.1 java jdk 1.7

CachedRowSet Javadoc(強調我的):

CachedRowSet對象是斷開連接的行集,這意味着它只是短暫地使用與其數據源的連接。 它在讀取數據時連接到其數據源,以便用行填充自身,並在將更改傳播回其底層數據源時再次連接 剩下的時間, CachedRowSet對象被斷開連接,包括在修改其數據時。

從你的問題:

看起來程序試圖用~35,000,000行填充行集,而不考慮pageSize配置

是的, CachedRowSet將立即從您的數據庫中檢索35m行,之后它將應用分頁和其他已定義的屬性。 一種可能的解決方案是通過小塊處理數據並在每一行上標記以將其標記為已處理。

我建議使用像Pentaho這樣已經處理過這類問題的ETL工具。

事實上,游標的支持是在postgres JDBC中隱式編碼的,如文檔中所述。 但是,在某些條件下會自動創建光標。

http://jdbc.postgresql.org/documentation/head/query.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM