2015-10-19 96 views
1

我加載到數據庫表8000的記錄有關的用戶,我對這些數據做一些操作,並在結束時,我想與平衡接收回來我的8000條記錄的值。我的代碼:的ResultSet不返回所有

public void getBalance(String database){ 
    Connection conn=null; 
    Statement stmt=null; 
    ResultSet rs=null; 
    try{ 
     Class.forName("oracle.jdbc.driver.OracleDriver"); 
      conn=DriverManager.getConnection(
       "jdbc:oracle:thin:@address","user","password"); 
      stmt=conn.createStatement(); 
      rs=stmt.executeQuery("select count(*) from balance1"); 
      int count=0; 
      while(rs.next()){ 
      count=rs.getInt(1); 
      } 
      System.out.println("The count is "+count); 
      conn.setAutoCommit(false); 
      stmt.setFetchSize(count);  
      rs = stmt.executeQuery("select * from balanceview"); 
      writeToAFile(rs); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    }finally{ 
     if(conn!=null){ 
      try{ 
       conn.close(); 
      }catch(Exception e){ 
       _logger.severe(e.getMessage()); 
       e.printStackTrace(); 
      } 
     }if(stmt!=null){ 
      try{ 
       stmt.close(); 
      }catch(Exception e){ 
       _logger.severe(e.getMessage()); 
       e.printStackTrace(); 
      } 
     }if(rs!=null){ 
      try{ 
       rs.close(); 
      }catch(Exception e){ 
       _logger.severe(e.getMessage()); 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

但我面臨的問題只有2000個值返回。有沒有辦法返回所有8000個值。

+0

什麼是'count = rs.getInt(1)'*應該*做什麼?它應該是'count ++'而不是?我還建議''stmt.setFetchSize(count)'不是一個神話般的想法,除非你有大量的內存扔在這... – JonK

+1

你正在從'balance1'中選擇計數,但是之後查詢'balanceview' 。這是正常的嗎? – Tunaki

+0

有餘額1是我的表,其中所有8000個客戶存儲和balanceview僅僅是包含餘額1臺簡單的選擇 – user3428496

回答

0

JDBC將始終將默認行數(而不是整個結果集)讀取到本地內存中。一旦到達取出行的最後一行(例如通過執行next()並嘗試訪問下一行),並且如果結果中有更多行,則會對數據庫執行另一個往返調用以獲取下一個一批行到本地內存。

即使你可以設置你想在本地內存比平常讀取的行數,你可以考慮CachedRowSet的。

當你在聲明設置FETCHSIZE(),你只給到你要多少,應該讀出JDBC驅動程序的指令,但是JDBC驅動程序可以自由地忽略你的指令。我不知道Oracle驅動程序用fetchSize()做什麼。大多數情況下,它觀察到MySQL JDBC驅動程序將始終獲取所有行,除非將fetchSize()設置爲Integer.MIN_VALUE,但Oracle數據庫並非如此。