1

クラス、場所があります。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 を永続化するためにある種のバッチ サイズを自動的に設定できますか?

4

2 に答える 2

2

OpenJPAはわかりませんが、Hibernateをよく使用しています。おそらく、トランザクションサイズを自分で制御する必要があります。コードを少し変更すれば、これは簡単なはずです。

  1. ロケーションを作成して永続化します。おそらく、データベーストランザクションもコミットする必要があります。
  2. BorderPointsをデータベースに永続化し、親の場所が設定されていることを確認します。これは、親の場所がBorderPointにマップされていることを意味します。おそらく100ボーダーポイントごとにコミットしたいと思うでしょう。
  3. データベースから場所を照会し、そのBorderPointsにアクセスします。永続化されたすべてのBorderPointがそこにあるはずです。
于 2011-04-04T19:09:35.640 に答える
1

JTAを使用する場合は、インポートを自分でバッチに分割する必要がある場合があります。ただし、実際に各ポイントを行として格納する必要があるかどうかを確認することをお勧めします。

私の同僚は、多くのポイントを含むグラフを保存しようとしましたが、パフォーマンスが低下した後、使用状況を分析し、常にすべてのポイントをロードしていることに気付きました。したがって、すべてのポイントをブロブにシリアル化することになり、パフォーマンスが大幅に向上しました。

于 2011-04-04T19:08:51.550 に答える