0

別の質問で対処した問題がありますが、これはより大きな質問です。

STSを使用するデフォルトのGrailsプロジェクトには、Spring/Hibernateが隠されています。Grailsアプリケーションがロードされると、100,000以上のドメインオブジェクトのデータベースがメモリにロードされているように見えます。これがHiberate/ORMレイヤーにあるかどうかはわかりませんが、

Pre DB domain object load (400 MB start up)
Post DB domain object load (900 MB start up)

これには、ブートストラップデータはありません。箱から出してすぐにアプリのパフォーマンスはありません。クリーンなスタートアップと私のドメインオブジェクト。

モニターは使えますが、同じ答えが返ってきます。これは構成のようです。これらのオブジェクトをメモリにロードしないようにGrails内でHibernateを設定するにはどうすればよいですか?

これはdatasource.groovyファイルです:

dataSource {
pooled = true
driverClassName = "com.mysql.jdbc.Driver"
username = "xxx"
password = "xxx"
}
hibernate {
cache.use_second_level_cache = false
cache.use_query_cache = true
cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
}
// environment specific settings
environments {
development {
    dataSource {
        dbCreate = "update"
        url = "jdbc:mysql://localhost/mydb"
    }
}
test {
    dataSource {
        dbCreate = "update"
        url = "jdbc:mysql://localhost/mydb"
    }
}
production {
    dataSource {
        dbCreate = "update"
        url = "jdbc:mysql://localhost/mydb"
    }
}
}

私はファイルを起動するためにあらゆる種類の微調整を試みたので、これは私を殺しています(ブートストラップ、データソース/休止状態、構成など-私が試したすべての異なることを思い出すことさえできません)。

*編集* オブジェクトで熱心なフェッチを使用していません。ただデフォルトの怠惰です。

4

1 に答える 1

3

どのようにプレ/ポストメモリー番号を取得していますか? BootStrap.groovy ファイルに非常に奇妙なプラグインや特別なものがない限り、ドメイン オブジェクトのセット全体がメモリに読み込まれる可能性は低いと思います。

これが本当に起こっているかどうかを確認する最も簡単な方法は、休止状態のトレース レベルのログをオンにすることです。

trace 'org.hibernate.SQL'

実際に DB からすべてをメモリにロードしている場合、アプリの起動時に大量の SQL クエリが実行されていることがわかります。

さらに調査するには、 hibernate の JMX モニタリングをjconsole有効にしてから、実行中の grails インスタンスに接続して、ロードされているものとロードされていないものの詳細を調べることをお勧めします。

于 2012-05-15T04:32:57.403 に答える