OpenJPA中的自动事务

时间:2011-04-04 18:50:39

标签: java openjpa

我有一个班级,位置。 Location包含一个BorderPoint对象列表,但它可以是一个巨大的列表(20,000不是不可能的)。这个表是LOCATION和BORDERPOINT。

我最初通过从ESRI Shapefile导入来填充Location。这是一段代码片段:

        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();
        }

由于List中有如此多的BorderPoint对象,但我只是通过调用Location对象上的persist来保存它们,我是否可以自动设置某种批量大小来保存BorderPoints?

2 个答案:

答案 0 :(得分:2)

我不知道OpenJPA,但我已经使用了很多Hibernate。您可能必须自己控制事务大小。如果您稍微更改代码,这应该很简单:

  1. 创建并保留位置。您可能还应该提交数据库事务。
  2. 将BorderPoints保留到数据库中,确保已设置其父位置。这意味着父位置映射在BorderPoint上。你可能想要提交每100个BorderPoints左右。
  3. 从数据库中查询位置并访问其BorderPoints。所有持久化的BorderPoints都应该存在。

答案 1 :(得分:1)

如果您使用JTA,您可能必须自己将导入分为批次。但是,您可能想要检查是否确实必须将每个点存储为一行。

我的同事试图保存一个有很多分数的图表,在获得不良表现后,他们分析了使用情况并意识到他们总是加载所有点数。因此,他们最终将所有点序列化为一个blob,并且性能提升很大。