Hibernate Grails应用程序启动太慢
我正在使用Grails2.4.4开发一个web应用程序,grails(使用jetty插件)大约需要20秒来初始化并使应用程序可用 我可以接受这段相当长的时间,但对于较旧的硬件来说,启动整个过程需要3分钟,我需要更快,因为一旦服务器启动,性能就很好,不成问题 在Google上四处搜索发现了一个问题,即jar扫描servlet注释可能是问题所在,并对WEB-INF/lib中的类禁用了它,并将其添加到应用程序上下文xml中:Hibernate Grails应用程序启动太慢,hibernate,grails,jetty,gorm,Hibernate,Grails,Jetty,Gorm,我正在使用Grails2.4.4开发一个web应用程序,grails(使用jetty插件)大约需要20秒来初始化并使应用程序可用 我可以接受这段相当长的时间,但对于较旧的硬件来说,启动整个过程需要3分钟,我需要更快,因为一旦服务器启动,性能就很好,不成问题 在Google上四处搜索发现了一个问题,即jar扫描servlet注释可能是问题所在,并对WEB-INF/lib中的类禁用了它,并将其添加到应用程序上下文xml中: <Call name="setAttribute"> &
<Call name="setAttribute">
<Arg>org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern</Arg>
<Arg>nothing.jar$</Arg>
</Call>
org.eclipse.jetty.server.webapp.webinIncludeJarPattern
什么都没有$
这有助于将时间从16秒缩短到13秒。
还尝试使用Servlet2.5而不是3.0进行构建(并移动到Jetty7),以进一步改进这一点,因为注释扫描是Servlet3.0的一项功能,但速度提高很小(大约1s)
我的目标是将这一时间降低到6秒,因为在我测试过的最旧硬件中,它大约需要3分钟,因此速度要慢10倍左右,1分钟的启动时间在某种程度上是可以忍受的
我对如何做到这一点有点迷茫。查看日志发现,上下文初始化大约需要2000毫秒
2017-02-08 02:15:08318[main]INFO context.ContextLoader-根webapplication
nContext:初始化在2001毫秒内完成
有没有可能加快这一速度?如果您使用的是Jetty 9.x,那么就要知道,由于Servlet 3.1的实现,类路径/字节码扫描是一项要求(这需要它) 使用
org.eclipse.jetty.server.webapp.webincludeJarPattern
只跳过WEB-INF/lib
中的那些JAR,但您的容器类路径仍会被扫描(意味着活动grails环境中的所有内容)
注意:您不应该让生产服务器被构建工具(maven、grails等)踢出,因为这会带来巨大的性能和安全风险
不可能通过交换servlet支持jar来更改扫描行为(事实上,您不能将servlet 2.5 jar与Jetty一起使用,它将彻底失败)。使用Servlet2.5JAR交换的实际操作是更改应用程序的支持级别,而不是Jetty中的行为
但并不是所有的都丢失了,您可以“预先计算”扫描需求,并使用Jetty 9的功能启动应用程序,提供所需内容,避免每次启动时重复扫描
云提供商大量使用快速启动技术,几乎可以即时启动web应用程序(通常低于500毫秒)
注意:如果您使用的是hibernate、spring、cdi或其他具有自己注释的库,那么该库通常会执行另一个字节码扫描步骤,而不是Jetty
嗨,谢谢你的回答。当我更改Servlet jar时,我也将我的应用程序移动到jetty 7,但我忘了提到这一点。我也尝试过jetty 9 quickstart,但是webapp是第一次加载的,当我重新启动jetty时,它失败了,出现了一个URI非层次错误。我可以让jetty quickstart工作,所以现在开始时间已经降到10秒。我现在就解决这个问题。非常感谢。