2

ログデータを表示するためのWebインターフェイスを構築したいと思います。これは、Grailsを使用して小さなWebアプリを構築する良い機会になるはずです。これは、私がかなり前から試したいと思っていましたが、今日の手動SQLクエリをに「変換」する方法を理解するのに苦労しています。 Grailsに使用できるもの。

Grails In Actionの本で、既存のデータテーブルをドメインクラスに後付けすることについての情報はあまり見つかりませんでした。だから私はいくつかの説明のためにそれをここに持ってきます:)

これは基本的に、今日ログに記録しているログテーブルのスキーマです。

LOG(id,method,timestamp,millis_used,username,hostname,...etc)

hasMany = { logs: Log }ドメインクラスUserとHostをのようなマッピングで作成し、Logクラスをで作成するようなことをしているのを見ることができますbelongsTo = { user: User }が、特に数十万のログ行を処理する場合、これを効果的な方法で使用してデータをクエリする方法はわかりません。私は通常、"find the average time used for method='fooBar' and user='john_doe' the last 30 days"またはのようなデータに対してクエリを実行しています"count the number of rows where method='fooBaz' and host='localhost' from May to December"

このような情報をどのように取得しますか?ログエントリのマッピングを忘れて、テーブルに対してある種の直接SQL(HQL?)クエリを使用するだけですか、それともこの(私には知られていない)GORM獣をこのようなものに使用できますか?

4

2 に答える 2

4

まず、テッドの反応に同意します。GORMドメインを設定する前に、Burtのプレゼンテーションを確認してください。

次に、基準を確認することをお勧めします。Hibernate Criteria機能用のGrailsDSLは、非常にクリーンで保守可能なコードベースになります。ここではいくつかの例を示します。

基準の例:

def avg = Log.createCriteria().get {
    projections {
        avg 'duration'
    }
    user {
        eq 'userName', 'user1'
    }
}
println("Average = ${avg}")

ドメインオブジェクトの例:

class User {

    String userName
    String firstName
    String lastName

    static constraints = {
        userName nullable:false, maxSize:32
        firstName nullable:false, maxSize:50
        lastName nullable:false, maxSize:50
    }

}

class Host {

    String hostname

    static mapping = {
        version false
    }

    static constraints = {
        hostname nullable:false, maxSize:64
    }
}

class Log {

    Host host
    User user
    String method
    String logMessage
    Date dateCreated
    long duration

    static mapping = {
        autoTimestamp true  //Note: this will automatically update dateCreated and lastUpdate
        version false
    }

    static constraints = {
        host nullable:false
        user nullable:false
        method nullable:false, maxSize:50
        logMessage nullable:false, maxSize:255
        duration nullable:false
    }
}
于 2011-04-03T21:22:02.557 に答える
2

ユーザーごとまたはホストごとのログ記録に必要なレコードがいくつもあるので、hasMany関係は使用しません。ロギングは書き込みが多くなる傾向があり、メンバーごとのログのセット/リストを維持するにはコストがかかり、その価値はありません。

HQLはおそらくあなたの最善の策です。ネイティブSQLのように見えるように作成できます。

バート・ベックウィズは、GORMを使用したグレイルでのパフォーマンスのいくつかについて説明する素晴らしいプレゼンテーションを行っています。これは、時間をかけて見る価値があります。http: //www.infoq.com/presentations/GORM-パフォーマンス

于 2011-04-03T17:27:26.400 に答える