нехватка памяти исключение в RMI - PullRequest
2 голосов
/ 14 ноября 2010

Дорогие все, я использую Java RMI для моей программы, со стороны клиента я вызываю мой интерфейсный метод, передавая один аргумент.Используя этот аргумент, интерфейс запускает запрос и возвращает 40000 строк (каждая строка содержит 10 строк) в результате. Все они хранятся в векторе внутри структуры вектора [[0,1,2,3,4,5,6,7,8, 9], [], [], [], [], [] ...].Это происходит, когда я нажимаю одну кнопку.Первый раз это работает, но снова я пытаюсь сделать то же самое (то есть, нажав кнопку). Он показывает java.lang.out исключения памяти на стороне клиента .Пожалуйста, помогите мне. Я использую Postgresql db.

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 после завершения моего процесса, но все еще выбрасываю исключение Out of memory на стороне клиента, это происходит, когда отправляются данные (вектор результата запроса)на стороне клиента.

Ответы [ 2 ]

1 голос
/ 14 ноября 2010

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

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

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

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

0 голосов
/ 14 ноября 2010

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

...