JavaFX — OME при сохранении данных в HSQLDB из данных JSON

#java #performance #javafx-2 #hsqldb

#java #Производительность #javafx-2 #hsqldb

Вопрос:

Я использовал HSQLDB для хранения данных в моем приложении. Я выполняю 15 вызовов веб-службы один за другим. и сохраняйте данные в БД. Он отлично работает для минимального объема данных. Я получил OME (ошибка нехватки памяти) для больших данных. Я имею в виду, предположим, что у меня около 20 тысяч записей для метода веб-службы.Итак, мы получаем OME при сохранении данных в БД. Я также пытался использовать функцию профилировщика, но не могу найти, какой объект потреблял больше памяти кучи. Итак, я попал сюда. Мне нужна чья-нибудь помощь, чтобы решить эту проблему.

 Code

 try {
            JSONObject jSONObject = getJSONData(clientId, ApplicationConstants.REST_METHOD_GET_ALL_CATEGORIES_LIST_BY_CLIENT_ID);
            if (jSONObject != null) {
                JSONArray jSONArray = jSONObject.getJSONArray(ApplicationConstants.JSON_OBJECT_RESPONSE);
                Integer length = jSONArray.length();
                if (length == 0) {
                    if (_logger.isInfoEnabled()) {
                        _logger.info("Categories not found for client {}", clientId);
                    }
                } else {
                    if (_logger.isInfoEnabled()) {
                        _logger.info("{} Categories found for client {}", length, clientId);
                    }

                    SyncDao synDao = (SyncDao) getDAO(ApplicationConstants.REST_SYNC_DAO);

                    for (int i = 0; i < length; i  ) {
                        JSONObject jSONObj = jSONArray.getJSONObject(i);
                        ProjectMenu projectMenu = new ProjectMenu();
                        projectMenu.setClientId(clientId);
                        projectMenu.setCategory(ApplicationConstants.PROJECT_MENU_CATEGORY_SUB_MENU);
                        projectMenu.setCategoryType(ApplicationConstants.CATEGORY_TYPE_CATEGORY);
                        projectMenu.setCreatedDate(jSONObj.getString(ApplicationConstants.REST_CATEGORY_CREATED_DATE));
                        projectMenu.setElementId(jSONObj.getString(ApplicationConstants.REST_CATEGORY_ID));
                        projectMenu.setIsLeaf(Boolean.FALSE);
                        projectMenu.setLabel(jSONObj.getString(ApplicationConstants.REST_CATEGORY_NUMBER));
                        projectMenu.setLevel(new Integer(4));
                        projectMenu.setSortOrder(jSONObj.getInt(ApplicationConstants.REST_CATEGORY_SORT_ORDER));
                        // Getting parent menu details
                        ProjectMenu parentProjectMenu = synDao.getProjectMenu(clientId, 
                                jSONObj.getString(ApplicationConstants.REST_CATEGORY_PROJECT_COMPONENT_ID), ApplicationConstants.CATEGORY_TYPE_COMPONENT);
                        if (parentProjectMenu != null) {
                            if (ApplicationConstants.REST_NO_COMPONENT_LABEL.equalsIgnoreCase(parentProjectMenu.getLabel())) {
                                projectMenu.setParentMenuId(parentProjectMenu.getParentMenuId());
                            } else {
                                projectMenu.setParentMenuId(parentProjectMenu.getId());
                            }
                            projectMenu.setProjectId(parentProjectMenu.getProjectId());
                        }

                        if (_logger.isDebugEnabled()) {
                            _logger.debug("Persisting Category: {}", projectMenu.toString());
                        }
                        synDao.persist(projectMenu);
                    }
                }
            }
        } catch (JSONException jsonex) {
            if (_logger.isErrorEnabled()) {
                _logger.error("Exception while synchronizing Categories.", jsonex);
            }
        }
  

Комментарии:

1. Подождите .. вы извлекаете все записи из таблицы или что? Я не понимаю вашего вопроса.

2. Я извлекаю данные из базы данных с помощью метода веб-службы, а затем сохраняю их в HSQLDB.

Ответ №1:

Использование таблиц ПАМЯТИ часто является причиной ошибок ООМ, когда объем данных в базе данных увеличивается.

Преобразуйте таблицы, содержащие большие объемы данных, в КЭШИРОВАННЫЕ таблицы, и ошибок ООМ больше не будет.

 SET TABLE t TYPE CACHED