2010-11-14 71 views
2

親愛的, 我使用Java RMI的我的程序,從客戶端我打電話通過傳遞一個參數我的接口方法。使用該參數接口運行查詢並返回40,000行(每行包含10行)。所有這些都存儲在向量結構[[0,1,2,3,4,5,6,7,8 ,9],[],[],[],[],[] ...]。當我點擊一個按鈕時會發生這種情況。第一次它的作品,但我也試圖做同樣的事情(即單擊按鈕)它顯示客戶端的內存異常java.lang.out。請幫助我。我正在使用Postgresql數據庫。內存溢出異常的RMI

Client side: 
    Vector data = new Vector(); 
    data = Inter.getEndProductDetailsForCopyChain(endProductId); 

Server side: 
    public Vector getEndProductDetailsForCopyChain(int endProductId1) 
    { 
     Connection OPConnect = StreamLineConnection.GetStreamline_Connection(); 
     Vector data=new Vector();  
     try{   
      System.out.println("Before query data vector size>>>>>>>>"+data.size());//mohan 
      String sqlQry = "select distinct style_no,version_no,matNo,type,specs,color,size,ref_no,uom1 from garment where id=" +endProductId1; 
      System.out.println("sqlQry"+ sqlQry); 
      Statement st=OPConnect.createStatement(); 
      ResultSet rs = st.executeQuery(sqlQry); 
      while(rs.next()){ 
       Vector row = new Vector(); 
       row.add(rs.getString("style_no")); 
       row.add(rs.getString("version_no")); 
       row.add(rs.getString("matNo")); 
       row.add(rs.getString("type")); 
       row.add(rs.getString("specs")); 
       row.add(rs.getString("color")); 
       row.add(rs.getString("size")); 
       row.add(rs.getString("ref_no")); 
       row.add(rs.getString("uom1")); 
       row.add(new Boolean(false)); 
       data.add(row); 
       } 
      System.out.println("After query data vector size>>>>>>>>"+data.size()); 
     }catch(Exception e) 
     { e.printStackTrace(); 
      closeConnection(OPConnect); 
     } 
      return data; 
     } 

我清除了所有的向量和整理我的過程,但仍然在客戶端拋出內存異常終止後的HashMap時的數據(查詢結果向量)分發到客戶端發生這種情況。

+1

你爲什麼要在內存中加載如此龐大的數據? – 2010-11-14 11:11:31

+0

根據需要它是必要的。我只給了一個示例查詢。真的那是一個巨大的查詢。 – Mohan 2010-11-14 11:19:51

+0

我認爲你是在服務器上使用PostgreSQL的事實是不相干......」剛說,消除因素爲您服務。 – 2010-11-14 11:25:06

回答

0

嘗試重新使用data,不產生對每個請求一個新的載體。 data.clear(); // fill it then

+0

謝謝,我應該在哪裏添加這條線在客戶端或服務器上 – Mohan 2010-11-14 11:17:21

+0

@Mohan在服務器和客戶端,我不確定它會幫助避免,但每創建一個'new Vector()'時間會給垃圾收集器帶來負擔,org.life.java的問題是關鍵:爲什麼你需要將它加載到內存中? – khachik 2010-11-14 11:20:17

+0

是否可以在不加載到內存的情況下執行此操作。可以給出解決方案。 – Mohan 2010-11-14 11:23:11

1

你的問題的直接回應:如果你可以改變客戶端JVM的命令行參數,然後分配更多的內存啓動。例如,使用-Xmx256M可以使用256兆的最大內存。

對您的問題更有用的回答:您說出問題的方式表明您知道真正的問題:一種程序架構,它試圖獲得如此多的數據單擊。你真的需要在客戶端有這麼多的數據嗎?你可以在服務器端進行一些處理,併發送更少的?你可以添加分頁嗎?或延遲加載?

考慮谷歌的搜索模式作爲一個可能的解決方案...谷歌搜索「你好」擁有約310,000,000比賽,但谷歌只給我發10個結果的時間。然後我點擊「下一步」以獲得更多...這是分頁。用戶通常無法一次對40,000行數據有太多意義。這對你有用嗎?

如果這是用於出口,同時取得100行左右,導出,然後再讀取下一行...你真的不希望被通過RMI在一個呼叫轉移如此多的數據。

+0

雅好的提示我會試試這個。非常感謝。 – Mohan 2010-11-14 11:29:19

+0

非常感謝史蒂夫。 – Mohan 2010-11-14 12:21:52