2010-11-14 4 views
2

Уважаемый всех, Я использую java rmi для своей программы, с клиентской стороны я вызываю свой метод интерфейса, передавая один аргумент. Используя этот интерфейс, выполняется запрос и возвращает 40 000 строк (каждая строка содержит 10 строк). Все они хранятся в векторной внутри векторной структуре [[0,1,2,3,4,5,6,7,8 , 9], [], [], [], [], [] ...]. Это происходит, когда я нажимаю одну кнопку. В первый раз его работы, но снова я пытаюсь сделать то же самое (например, нажатие кнопки). Он показывает java.lang.out исключения памяти на стороне клиента. PLS помочь мне. Я использую Postgresql db.исключение из памяти исключение в 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

Почему вы загружаете такие огромные данные в память? –

+0

В соответствии с требованием это необходимо. Я дал только пример запроса. Действительно, это был огромный запрос. – Mohan

+0

Я думаю, что факт, что вы используете Postgresql на сервере, не имеет значения ... «Просто говорю, что для устранения факторов для вас. –

ответ

0

Попробуйте повторно использовать data, не создавайте новый вектор для каждого запроса. data.clear(); // fill it then.

+0

Спасибо, где я должен добавить эту строку на стороне клиента или на сервере – Mohan

+0

@Mohan В сервере и клиенте. Я не уверен, что это поможет избежать. Но создание 'new Vector()' each время ставит нагрузку на сборщик мусора. Вопрос от org.life.java является ключевым моментом: зачем вам его загружать в память? – khachik

+0

можно сделать это без загрузки в память. Возможно, решение получится. – Mohan

1

Прямой ответ на ваш вопрос: если вы можете изменить параметры командной строки JVM клиента, тогда начните с выделения большего количества памяти. Например, используйте -Xmx256M для использования максимальной памяти 256 мегабайт

Более полезный ответ на ваш вопрос: способ формулировки вашего вопроса предполагает, что вы знаете реальную проблему: программная архитектура, которая пытается получить так много данных на один клик. Вам действительно нужно иметь так много данных на стороне клиента? Можете ли вы выполнить некоторую обработку с ним на стороне сервера и отправить гораздо меньше? Можете ли вы добавить пейджинг? или ленивая загрузка?

Рассмотрите поисковую систему Google как возможное решение ... Поиск Google для «привет» насчитывает около 310 000 000 совпадений, но Google только отправляет мне 10 результатов за раз. Затем я нажимаю «Далее», чтобы получить больше ... это пейджинг. Пользователи не могут, как правило, иметь представление о 40 000 рядов данных одновременно. Будет ли это работать для вас?

Если это для экспорта, выборки из примерно 100 строк за один раз, их экспорт, а затем выборка следующих строк ... вы действительно не хотите передавать столько данных через RMI за один звонок.

+0

Я хороший совет, я попробую это. Большое спасибо. – Mohan

+0

Большое спасибо Стив. – Mohan