0

私は Grails 1.3.7 を休止状態 1.3.7 と MySQL 5.1 で使用しています。次の(簡略化された)ドメイン オブジェクトがあります。

class Document {
    String externalId
    Date date
    String url
    String title

    Map metadata = new HashMap()

    def propertyMissing(String key) { return   metadata[key] }
    def propertyMissing(String key, String value) { metadata[key] = value } 
}

クライアントに返すためにこれらのドキュメントの束をロードする必要がある場合、システムは各ドキュメントに対して個別のクエリを実行して、関連するメタデータを取得する必要があります。メタデータを含む数百のドキュメントを取得するには、妥当なマシンで数十秒かかります。言うまでもなく、これはインタラクティブに使用するには遅すぎます。私のアプリケーションはすべてのデータをブラウザにロードしてユーザーが操作できるようにしたいので、クエリを「ページ」に分割することはできません。

現在、私が実行しているクエリは次のようになります。

Document.executeQuery("select distinct p.document from Posting p where p.topic = :topic", [topic: topic]);

このクエリにより、一連のDocumentインスタンスが作成されますが、これには長い時間がかかります。

Hibernate キャッシュは次のように構成されます。

hibernate {
    cache.use_second_level_cache=true
    cache.use_query_cache=true
    cache.provider_class='net.sf.ehcache.hibernate.EhCacheProvider'
}

問題のテーブルは次のとおりです。

mysql> describe document;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| version     | bigint(20)   | NO   |     | NULL    |                |
| date        | datetime     | YES  |     | NULL    |                |
| external_id | varchar(255) | NO   |     | NULL    |                |
| title       | longtext     | YES  |     | NULL    |                |
| url         | longtext     | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

mysql> describe document_metadata;
+--------------+---------------+------+-----+---------+-------+
| Field        | Type          | Null | Key | Default | Extra |
+--------------+---------------+------+-----+---------+-------+
| metadata     | bigint(20)    | YES  |     | NULL    |       |
| metadata_idx | varchar(255)  | YES  |     | NULL    |       |
| metadata_elt | varchar(4096) | YES  |     | NULL    |       |
+--------------+---------------+------+-----+---------+-------+

メタデータ テーブルとハード コーディング フィールドをDocument直接ダンプする以外に、コードのパフォーマンスを向上させるために他にできることはありますか?

遺伝子

4

2 に答える 2

0

おそらく、ネイティブ SQL 呼び出しを使用してデータ取得操作を最適化できます

def sql = '''
  select distinct d.*, m.* 
  from 
    document d 
      join document_metadata m on m.metadata = d.id
      join post p on p.id = d.post_id
  where
    post.topic = :topic'''

def query = session.createSQLQuery(sql)
query.addEntity(com.yourdomain.Document.class)
query.setString("topic", "grails")
def documents = query.list()

投稿スキームと関係を推測しているため、明らかに選択は不完全です

于 2012-08-31T01:04:00.857 に答える
0

メタデータをアソシエーション ドメイン クラスに入れてみて、Grails のデフォルトのアソシエーションの遅延読み込みに依存することができます。次に、それぞれのコア情報をDocumentより高速にロードし、特定の へのアクセス時にメタデータのみをロードできますDocument

class Document {
    // Core non-Map data

    DocumentMetadata metadata

    def propertyMissing(String key) { return metadata?.data?.get(key) }
    def propertyMissing(String key, String value) { 
        if (!metadata) { metadata = new DocumentMetadata() }
        metadata.data[key] = value
    }
}

class DocumentMetadata {
    Map data = new HashMap()
}
于 2012-08-31T03:03:04.450 に答える