Автоматические транзакции в OpenJPA - PullRequest
1 голос
/ 04 апреля 2011

У меня есть класс, Местоположение. Location содержит список объектов BorderPoint, но это может быть ОГРОМНЫЙ список (20000 не является невозможным). Таблицы для этого: LOCATION и BORDERPOINT.

Я изначально заполнил Location с помощью импорта из шейп-файла ESRI. Вот фрагмент кода:

        try {
            while (featureIterator.hasNext()) {
                Location location = new Location();

                SimpleFeatureImpl feature = (SimpleFeatureImpl) featureIterator.next();

                // set the information in location based on stuff in the feature, lets me clean up this
                // method a bit
                setLocationInfo(location, feature);

                List<BorderPoint> borderPointList = getBorderPoints(feature, location);
                //saveBorderPoints(location, feature);
                location.setBorderPointList(borderPointList);

                try {
                    locationRepository.persist(location);
                } catch (RepositoryException e) {
                    throw new ServiceException("processShapefile() threw RepositoryException", e);
                }
            }
        } finally {
            featureIterator.close();
        }

Поскольку в списке так много объектов BorderPoint, но я сохраняю их только путем вызова persist для объекта Location, могу ли я автоматически установить какой-либо размер пакета для сохранения BorderPoints?

Ответы [ 2 ]

2 голосов
/ 04 апреля 2011

Я не знаю OpenJPA, но я часто использую Hibernate.Возможно, вам придется самостоятельно контролировать размер транзакции.Если вы немного измените код, это будет легко:

  1. Создайте и сохраните Местоположение.Вероятно, вам также следует зафиксировать транзакцию базы данных.
  2. Сохранять BorderPoints в базе данных, убедившись, что вы установили их родительское расположение.Это означает, что родительское расположение сопоставлено с BorderPoint.Вы, вероятно, хотите зафиксировать каждые 100 BorderPoints или около того.
  3. Запросите Location из базы данных и получите доступ к его BorderPoints.Все сохраненные BorderPoints должны быть там.
1 голос
/ 04 апреля 2011

Если вы используете JTA, вам, возможно, придется разбивать импорт на партии самостоятельно.Тем не менее, вы можете проверить, действительно ли вам нужно сохранять каждую точку в виде строки.

Мои коллеги пытались сохранить график с множеством точек и, получив плохую производительность, проанализировали использование и поняли, что всегда загружают всеточки.Таким образом они закончили сериализацию всех точек в BLOB-объект, и улучшение производительности было огромным.

...