Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate Grails应用程序启动太慢_Hibernate_Grails_Jetty_Gorm - Fatal编程技术网

Hibernate Grails应用程序启动太慢

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"> &

我正在使用Grails2.4.4开发一个web应用程序,grails(使用jetty插件)大约需要20秒来初始化并使应用程序可用

我可以接受这段相当长的时间,但对于较旧的硬件来说,启动整个过程需要3分钟,我需要更快,因为一旦服务器启动,性能就很好,不成问题

在Google上四处搜索发现了一个问题,即jar扫描servlet注释可能是问题所在,并对WEB-INF/lib中的类禁用了它,并将其添加到应用程序上下文xml中:

<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秒。我现在就解决这个问题。非常感谢。