帮助!我正在向Grails移植一个大的ruby应用程序 - 但我的应用程序的Grails启动需要超过2分钟。
我已经将dbCreate设置为“read”我已经确保我的高端双处理器桌面窗口框提供了Grails所需的RAM(1 Gig)。我没有安装插件。我有170个域类,曾经是ruby类。
启动时会打印出“Running Grails App ..”这一行然后挂起很长时间,然后打印出“Server running”行。
我刚刚做了一些事情,我把所有的id迁移到bigints。这似乎使问题恶化了。现在启动大约需要10分钟。
我是grails的新手你能不能给我一些关于在启动时记录事件的内容和位置的更多细节?至于分析vm,我做了很多Java已经有几年了。你推荐什么作为现在最好的分析工具?
我还能做些什么来加速Grails创业?
答案 0 :(得分:10)
不幸的是,我不确定除了你已经做的事情之外还能做多少事情。如您所知,启动时会有很多事情,包括所有插件解析/加载,向域对象添加动态方法以及Groovy的整体动态特性。
我不确定您使用的是哪个版本,但我已经要求能够在1.2启动时关闭依赖项检查,因为这会为启动时间增加一些时间。
我意识到上面的内容并没有太大帮助,所以也许这会是:我将我的应用程序分成几个插件。一个用于域对象,一个用于图形化功能,一个用于excel导入,另一个用于我需要的一些UI构造。我没有这么做只是因为启动时间较慢,但优点是我可以在将所有内容集成在一起之前将系统的各个部分分开测试。
我即将添加一项涉及至少10个新域对象的新功能,我首先在单独的插件中开发它们,因为它们必须与核心应用程序交互的少数对象存根。这使我既可以缩短启动时间,又可以更好地隔离代码。
因此,如果它是您的选项,请尝试将内容分开,以便您可以单独处理它们,这将有所缓解您的问题。让团队分别处理较小的组件,更好的模块化等方面也可能有其他好处。
希望这有帮助。
答案 1 :(得分:3)
170个域类相当大,但对我来说,2分钟似乎仍然很长。你安装了大量的插件吗?可能过于冗长的调试设置?
如果您创建了一个新的grails应用程序,复制到所有域对象(以及域对象可能需要实际操作的插件子集)中,并且看到需要多长时间,我会感到好奇。启动。
Jean建议尽可能将事情分开,这是一个很好的建议。我在之前的项目中做过类似的事情,我们有一个域插件,而我们的其他应用程序都依赖于该域插件。
您还可以使用grails events在启动时记录一些时间信息,以查看瓶颈所在。定时“PluginInstalled”事件应该是好的,因为我认为除了其他插件之外,hibernate插件也会被捕获。
答案 2 :(得分:2)
您可能遇到依赖性问题。如果您使用的插件依赖于maven中具有“开放式”依赖关系的库,那么每次都会在该范围内下载更新版本的grails。我不知道为什么有人会像这样指定它。这似乎会导致不可靠的行为。对我来说,罪魁祸首是亚马逊的java aws库,它自然地被一个与亚马逊的云对话的插件使用。
http://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk/1.2.10
注意它的一些依赖关系是如何的
org.apache.httpcomponents httpclient [4.1,5.0]
似乎每次,grails都在寻找更新版本(如果存在则下载,我只是注意到,当我这次运行时,httpclient的4.2-alpha1会降下来。)
通过从插件中删除该依赖项并手动将所需的库添加到我的.lib文件夹,我将启动时间从> 30秒减少到<1秒
答案 3 :(得分:1)
你可能想看看是否有其他旋钮可以转动而不是Grails来解决这个问题。
您是否尝试过将其视为性能问题?您可以查看盒子性能并尝试找出瓶颈是什么。是CPU吗?它是磁盘读取问题吗?您是否可以将分析器附加到VM并找出大部分启动时间的用途?
答案 4 :(得分:0)
您是否尝试过类似这样的基础知识,以便进一步部署到您选择的或就地的servlet容器.war bootstrapping?
grails -Ddisable.auto.recompile=true run-app
grails run-war
grails war