2

这个例子

我正在编写一个实用程序来使用 OpenCSV 在 CSV 中转换域类、pojos 和 pogos。我创建的示例在 git上可用。

这个想法是转到 index 操作TestController并点击将进行 ajax 调用的按钮。此 ajax 将在 CSV 中转换在引导程序上创建的域类的所有实例,Test并将此文本返回到视图。

流量

  • Bootstrap 创建 5000 条域类记录Test
  • 用户转到索引页面:/csv-example/test/index
  • 用户点击按钮,发出ajax请求
  • 控制器列出所有测试记录
  • csv 格式 ArrayList的控制器转换String
    • DefaultCSVConverter将寻找类 Test 的序列化程序
    • DomainClassSerializer将实例转换为List<String[]>
    • DefaultCSVConverter将使用OpenCSV编写List<String[]>

问题

如果我在模式下运行这个示例应用程序,Grails 会快得多production,我试图理解为什么。我已经尝试在dev模式下运行,禁用重新加载代理:

grails Ddisable.auto.recompile=true -noreloading run-app

这对转换实例所花费的时间没有影响。

所以我的问题是:除了重载代理,还有什么可以让开发模式和生产模式之间的性能有所不同?

环境

圣杯 2.2.1

赢 7 x64

JDK 1.6.0_43 64 位

4

3 回答 3

1

似乎差异是由国际化引起的。PluginAwareResourceBundleMessageSource在 dev 和 prod 运行模式之间具有不同的性能。发现我使用了 Jvisualvm,在开发和生产模式下分析 CPU。

启动 Grails

set GRAILS_OPTS=-Xverify:none -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8500 -Dcom.sun.management.jmxremote.authenticate=false -

grails  -Ddisable.auto.recompile=true -noreloading run-app

启动 jvisualvm

jvisualvm -J-Xms1G -J-Xmx1G –cp:a path/to/app/target/classes

分析结果应如下所示

在此处输入图像描述

于 2013-04-13T13:51:58.797 回答
0

我查看了您的 github 代码,并查看了 prod dataSource - pooled=true?这能做到吗?

于 2013-04-12T21:28:43.237 回答
0

我的理解是,关于应用程序可执行文件,prod 和 dev 的主要区别在于 grails-app/conf 中定义的内容。假设您对 prod 和 dev 具有相同的硬件/操作系统配置和启动参数,我将首先查看您的配置文件中的不同之处。

你的 Config.groovy

environments {
    development {
        grails.logging.jul.usebridge = true
    }
    production {
        grails.logging.jul.usebridge = false
        // TODO: grails.serverURL = "http://www.changeme.com"
    }
}

数据源.groovy

development {
        dataSource {
            dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', ''
            url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
        }
}
...
production {
        dataSource {
            dbCreate = "update"
            url = "jdbc:h2:prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
            pooled = true
            properties {
               maxActive = -1
               minEvictableIdleTimeMillis=1800000
               timeBetweenEvictionRunsMillis=1800000
               numTestsPerEvictionRun=3
               testOnBorrow=true
               testWhileIdle=true
               testOnReturn=true
               validationQuery="SELECT 1"
            }
        }
}

突出的一件事(如果我错了,请纠正,因为我为 H2 配置数据源已经有一段时间了)是在 dev 中,您在内存中运行 H2,而在 prod 中,您正在写入磁盘。

于 2013-04-12T22:32:16.680 回答