我正在使用grails 2.4.4开发Web应用程序,Grails(使用jetty插件)花费了大约20秒钟的时间来初始化并使该应用程序可用。
我可以花相当长的时间来解决问题,但是对于较旧的硬件来说,启动整个过程需要3分钟,因此我需要更快的速度,因为一旦服务器启动,性能就不错,而不是要担心的问题。
在SO中进行了谷歌搜索,发现jar扫描servlet注释可能是问题,并在WEB-INF / lib中的类上将其禁用,并将其添加到应用上下文xml中:
<Call name="setAttribute">
<Arg>org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern</Arg>
<Arg>nothing.jar$</Arg>
</Call>
这有助于将时间从16秒减少到13秒。
还尝试使用配置为2.5而不是3.0的Servlet 2.5进行构建(并迁移到 jetty 7),以尝试进一步改进此功能,因为注释扫描是Servlet 3.0的一项功能,但是速度却很小(大约1秒)。
我的目标是将时间减少到6s,因为在我测试过的最旧的硬件中,它花费了大约3分钟的时间,因此它慢了大约10倍,并且1分钟的启动时间是可以忍受的。
我在实现该目标上有些失落。通过日志查看,上下文初始化大约需要2000ms
2017-02-08 02:15:08,318 [main] INFO context.ContextLoader-根WebApplicatio
nContext:初始化在2001 ms中完成
有没有可能加快这一步?
最佳答案
如果您使用的是Jetty 9.x,则应知道必须进行类路径/字节码扫描,因为它是Servlet 3.1的实现(需要这样做)。
使用org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern
仅会跳过WEB-INF/lib
中的这些jar,但仍会扫描您的容器类路径(这意味着您在 Activity grails环境中的所有内容)。
Note: you should never have a production server kicked from a build tool (maven, grails, etc) as that is a huge performance and security risk.
无法通过换出servlet支持jar来更改扫描行为(实际上,您不能将Servlet 2.5 jar与Jetty一起使用,它将完全失败)。 Servlet 2.5 jar交换的实际作用是更改应用程序的支持级别,而不是改变Jetty中的行为。
但是,一切都不会丢失,您可以“预先计算”扫描需求,并使用Jetty 9的
quickstart
features通过提供所需的内容来启动应用程序,从而避免每次启动时重复进行扫描。云提供商大量使用了快速启动技术,以使Web应用程序几乎即时启动(通常不到500毫秒)。
Note: if you are using hibernate, spring, cdi, or other libraries that have their own Annotations, then there is very often another bytecode scanning step performed by that library, not Jetty.
关于hibernate - Grails应用启动太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42105753/