首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Hibernate ORM与GraalVM本地映像编译兼容吗?

Hibernate ORM与GraalVM本地映像编译兼容吗?
EN

Stack Overflow用户
提问于 2019-05-23 20:25:31
回答 2查看 1.5K关注 0票数 4

根据文档,GraalVM项目中的本机映像编译器对动态代理有一些限制。由于Hibernate广泛使用代理,它能在提前编译的项目中正常工作吗?

夸库斯项目似乎表明它可以,但我的理解主要是基于Reddit邮报的一句话。

Hibernate ORM现在即使编译为GraalVM本地映像也可以工作--只需确保使用Quarkus构建应用程序。

如果我不想(或者不能)使用Quarkus怎么办?是否可以使用使用Hibernate的GraalVM (和SubstrateVM)编译本机映像应用程序?

Quarkus实际上做了什么来启用/支持Hibernate?

EN

回答 2

Stack Overflow用户

发布于 2019-07-30 11:42:12

(免责声明:我是通过创建Quarkus扩展使Hibernate ORM在GraalVM本地映像上工作的人之一。我还领导着Hibernate研发团队。)

谢谢你给我这个机会写下一点历史:)

最初,我们没有使用Quarkus,因为它还不存在。

我最初的原型只是修补Hibernate ORM,并堆积了许多编译器开关,以传递给本机映像工具,在bash脚本中硬编码,直到我的演示应用程序开始工作为止。

这种方法的问题在于,许多这样的标志实际上取决于Hibernate ORM的内部知识,以及域模型的细节、配置细节,以及更多细节。

我开始记录这样的事情,但它变得复杂和多毛;不仅仅是不同的方面相互依赖;而且,我的演示应用程序相当简单,而且在实际应用程序中,事情必然会变得更加复杂.我不认为我们能够写一份好的文件,这将是既简单又“可以理解”。

让最终用户保持简单的另一种选择是“启用对所有这些类的反映,因为您可能会使用它们”,但我有点喜欢优化,这会创建更大、更臃肿的二进制文件,而不是只包含和单独包含应用程序真正需要的所有东西时。

所以我们的团队决定写一个工具来自动化这些细节。它变成了一个构建工具,它分析应用程序,找出使用的最佳开关。与其只关注Hibernate ORM,我们还创建了“扩展”的概念,它也知道如何对其他库使用相同的技巧,这样您就可以从使用支持的库(而不仅仅是Hibernate )的更复杂应用程序中获得高度优化的二进制文件。

显然,这是必要的,因为不同的库可能有相互冲突的需求,每个库的编译器标志和最终用户的代码的组合都需要合并到一组一致的兼容标志中。

这就是夸库斯成为一件事的原因:)

要了解这方面工作的细节,我建议阅读指南和源代码:

我还对它在公开演讲中的工作方式作了一些高层次的概述;有一张来自英国Devoxx的好唱片

我的演讲专门讨论了Hibernate ORM;我没有太多时间详细介绍它所做的一切,但是在阅读实际代码之前,它应该是一个很好的介绍。

如果我不想(或者不能)使用Quarkus怎么办?是否可以使用使用Hibernate的GraalVM (和SubstrateVM)编译本机映像应用程序?

这是一个公平的问题-这当然是可能的,但夸库斯的团队会很想知道为什么?

Quarkus所做的所有工作主要是构建时;当然,在现阶段它可能是有限的,因为它是一个非常年轻的项目,但是如果您需要支持其他任何东西,那么在构建脚本中为其核心(或其扩展)贡献更容易,而不是硬编码复杂的编译器标志。同样重要的是,Quarkus社区正在成为讨论如何解决任何可能受到Graal限制的障碍的好地方。

Hibernate ORM的所有最复杂的补丁都被合并到Hibernate上游存储库中,因此所有重要的补丁都包含在最近的版本中。

假设您想保持对Quarkus的了解(我不建议这样做,但假设您想学习.),您仍然需要修改反射规则,实际上Quarkus限制了一些特性,最显著的是一些细节仍然“正在进行中”,或者我们认为人们不应该再使用的东西:)

具体来说,我和我的队友都不是线程绑定会话的忠实粉丝。我不打算实现对它的支持,除非有人会为它提供一个很好的理由:请打开一个特性请求,或者理想地帮助为它和一个补丁做一个很好的说明?

票数 7
EN

Stack Overflow用户

发布于 2019-09-20 13:26:28

如果您想知道,Quarkus实际上做了什么来启用本地映像,与其创建者:https://www.infoq.com/presentations/quarkus-graalvm-sao-paulo-2019/一起读取文本(或观看视频)?

我记得:

  • 在编译时解析所有注释查找和实体解析。
  • 使用“静态”初始化字段准备一些实例。准备好的实例存储在映像中,并准备在启动时仅在堆上分配。
  • 如果需要,在编译时生成“代理”
  • 基本上,Quarkus (作为gralvm的"plugin“)确实”在应用程序真正连接到数据库的时候启动应用程序“。而不是将内存快照嵌入到jar/本机文件中。
  • Quarkus也接触了其他一些库,它们做“禁止”的事情(封闭的世界假设)。

这将启用“热代码重新加载”,这实际上是在“眨眼”的时间内重新启动整个应用程序。它使用更少的内存和其他美好的东西。

PS:夸夸斯的小介绍在这里:https://www.infoq.com/news/2019/03/redhat-release-quarkus/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56282460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档