2

現在、プロジェクトで Envers を使用していますが、複数のテーブルに分散している監査済みデータをクエリすると、パフォーマンスが大幅に低下します。

基本的に、監査済みデータのストリームを次のように作成します。

List<Object[]> auditStream = new LinkedList<Object[]>();
for (Class<?> entityClass : desiredEntityClasses) {
    auditStream.addAll(
        auditReader.createQuery()
            .forRevisionsOfEntity(entityClass, false, true)
            .add(AuditEntity
                .revisionProperty("timestamp")
                .ge(startTimestamp))
            .getResultList());    
} 

その上、いくつかの種類のエンティティ (ネストされたエンティティなど) には追加の監査情報が必要です。

応答時間は (タイムスタンプを減らすことにより) 少量のデータには妥当ですが、 に 500 のエントリがあるauditStream場合、すべてを取得するのに約 3 秒かかります。これは長すぎます。

Q1この種のクエリでバッチ フェッチをオンにできるかどうか、またその方法を教えてください。

Q2一度に複数の種類のエンティティを取得するなど、クエリを最適化する方法はありますか?

4

2 に答える 2

2

1つのオーディションは、複数のテーブルの変更のコレクションです。

REVIDによって参照されるリビジョンテーブル(REVINFO)を使用する場合、他のすべてのテーブルは、このREVIDの一致する変更について検査されます。

Q1:依存するテーブルのすべての変更がエンティティに依存するわけではありません-オーディション、バッチフェッチはここでは機能しません。

Q2:HQLまたはプレーンSQLを介して直接変更をフェッチする方が適切です。

于 2012-11-07T14:53:54.680 に答える
1

これを効率的に実装するには、単一のテーブルのリビジョンで行われたすべての変更に関する情報が必要です。現在、複数のテーブルをクエリしています。

Envers 側からは、これが役立つかもしれません: http://docs.jboss.org/hibernate/core/4.0/devguide/en-US/html/ch15.html#envers-tracking-modified-entities-revchanges この方法でリビジョンで変更されたエンティティの名前を取得できますが、ストリームの要件が何であるか、つまりエンドユーザーに返す必要があるものはわかりません。

それ以外の場合は、いくつかのカスタム変更を実装するか、必要な「ストリーム」データを別のエンティティに保存する必要があると思います。

于 2012-11-08T08:57:04.603 に答える