6

組み込みのOpenJPA1.2.3とOracleデータベースを備えたWebsphereApplicationServer7を使用しています。私は次のエンティティを持っています:

    @NamedNativeQuery(name=Contract.GIVE_ALL_CONTRACTS, 
        query="SELECT number, name \n" +
          "FROM contracts \n" +
          "WHERE startdate <= ?1 \n" +
          "AND enddate > ?1",
          resultSetMapping = Contract.GIVE_ALL_CONTRACTS_MAPPING)
    @SqlResultSetMapping(name = Contract.GIVE_ALL_CONTRACTS_MAPPING, 
        entities = { @EntityResult(entityClass = Contract.class, fields = {
          @FieldResult(name = "number", column = "number"),
          @FieldResult(name = "name", column = "name")
        })
    })
    @Entity
    public class Contract {
      public static final String GIVE_ALL_CONTRACTS = "Contract.giveAllContracts";
      public static final String GIVE_ALL_CONTRACTS_MAPPING = "Contract.giveAllContractsMapping";

      @Id
      private Integer number;
      private String name;

      public Integer getNumber() {
        return number;
      }
      public String getName() {
        return name;
      }
    }

そして、コントラクトを取得するための次のコード:

Query query = entityManager.createNamedQuery(Contract.GIVE_ALL_CONTRACTS);
query.setParameter(1, referenceDate);

List contracts = query.getResultList();
entityManager.clear();

return contracts;

取得したコントラクトはWebサービスに渡されます。

Oracle Developerでこのクエリを実行すると、3608レコードで約0.35秒かかります。query.getResultList()の呼び出しには約4秒かかります。

エンティティの構成者にロガーを使用すると、同じタイムスタンプで作成されたエンティティが約10〜20個あることがログに記録されます。次に、0.015秒で何か他のことをします。OpenJPAのものだと思います。

OpenJPAを高速化する方法はありますか?それとも、唯一のソリューションキャッシングですか?

4

2 に答える 2

3

オブジェクトの作成は、パフォーマンス ヒットのかなりの割合を占めている可能性があります。サーバーでコードを実行している間、データベースにクエリを実行するだけでなく、メモリを割り当てて、行ごとに新しい Contract オブジェクトを作成します。拡張ヒープまたはガベージ コレクション サイクルは、観察されたアイドル期間にカウントされる場合があります。

大規模な結果セットを処理する方法については、OpenJPA のドキュメントをざっと読むことをお勧めします。

于 2012-09-27T08:57:06.760 に答える
0

VisualVM をダウンロードして、関連するパッケージのプロファイリングをセットアップすることをお勧めします。VisualVM は、さまざまな方法で費やされた時間を、理論的に合計すると 0.35 秒まで表示できます。コード、OpenJPA、およびネットワーク IO 間の合計時間の分布を分析できます。これは、ボトルネックを特定するのに役立ちます。

于 2012-09-27T10:12:50.367 に答える