2

我想构建一个 Web 界面来呈现日志数据。这应该是尝试使用 Grails 构建一个小型 Web 应用程序的好机会,我一直想尝试一段时间,但是我在理解如何将今天的手动 sql 查询“翻译”成对 Grails 有用的东西。

在 Grails In Action 一书中,我没有找到太多关于将现有数据表改造成域类的信息。所以我把它带到这里来澄清一下:)

这基本上是我今天登录的日志表的架构:

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

我可以看到自己在做一些事情,比如使用映射创建域类 User 和 HosthasMany = { logs: Log }以及 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

首先,我同意 Ted 的回答。在设置 GORM 域之前查看Burt 的演示文稿。

其次,我建议您看一下Criterias。用于 Hibernate Criteria 功能的 grails DSL 提供了一个非常干净和可维护的代码库。这里有些例子:

示例标准:

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。

Burt Beckwith 有一个很棒的演讲,谈到了 GORM 在 grails 中的一些性能,值得您花时间观看: http: //www.infoq.com/presentations/GORM-Performance

于 2011-04-03T17:27:26.400 回答