hibernate - Grails应用启动太慢

标签 hibernate grails jetty gorm

我正在使用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/

相关文章:

java - 使用 Hibernate 在运行时创建数据库?

java - 无法让 ManyToMany 处理 Hibernate Criteria 中的项目列表

spring - 在 Grails 的命令对象中获取 session

mysql - 使用 Grails 连接到 UTF-8 MySQL 数据库

java - 如何与 Hibernate 实现 3 多对多关系?

java - 在什么情况下我需要提供 spring 类名称作为 bean id 值?

grails - ils。域类。 1:米

android - 高速公路异常 WebSockets 协议(protocol)违规

java - Spark Web 框架记录请求和响应

maven - Jersey : "Missing dependency for method ..."