一个令人兴奋的微更新?!

版本 5.4.5.Final 可能看起来像是“又一个微更新”,但实际上它包含了许多重大改进。

我们只提高“微”版本的原因是我们在这个版本中保持了严格的向后兼容性,尽管改进的数量异常之多。

那么这个版本有什么特别之处呢?

  • OpenJDK 13 测试过

  • 几个强大的性能提升

  • 常规的错误修复

Java 13 兼容性

Java 13 已经发布,并且我们所有的集成测试都通过了。

当然,JDK8 兼容性仍然可用,JDK11 兼容性也是如此。

注意:我们不再在 JDK9 和 JDK10 上进行测试,并且我们可能很快就会停止在 JDK12 上进行测试。

简单情况下的性能显著提升

曾经,打开一个新的 Session(或一个新的 EntityManager)是一个相对昂贵的操作,因为 Hibernate 需要创建几个内部 Map 来表示其上下文。

我们从未认为这是优化的重要优先事项:我们建议重用它们,并期望大多数人会使用 Hibernate 进行非平凡的操作,从而抵消分配开销。

另一个不专注于此类优化角落案例的原因是,为了实现更复杂案例的峰值性能,特别是现实世界的工作负载,专注于简单情况将对真实案例构成限制 - 结果证明,这个假设是不成立的,因为我们现在发现,在不会对通用场景产生负面影响的情况下,我们可以做很多事情。

本版本中针对打开新的Session/EntityManager的内存分配问题进行了一些修复,并减少了部分计算开销;由于具体数值将取决于您的配置和需求,我不会分享确切数字,但如果人们报告在简单的单次操作中受益于400%的吞吐量提升,我并不会感到惊讶:我有“实验室证据”表明这是可能的,甚至可能更好,但由于许多此类指标只能在专门设计的微基准测试中实现,我们必须承认现实世界应用程序可能不会显示出相同水平的改进。

如果您对性能感兴趣并愿意尝试,请分享您的发现!至少这能激励我们继续努力:

事实上,Hibernate ORM在这一点上并不比直接使用JDBC重多少——要实现等价性还有很多工作要做,但我惊讶地发现自己竟然认为在不久的将来实现与纯JDBC的完全等价性并非不切实际。考虑到ORM对执行计划的总体了解更好,这有助于在结合像Quarkus这样的技术时,比命令式方法解锁更多的优化。我过于乐观的猜测是我们甚至可能在某些特定环境中打败纯JDBC。

令人兴奋的时代!

接下来是什么

我们仍在努力工作,以改进Hibernate ORM 6。这个版本当然将包括上述优化,但也将显著提高生成SQL的质量和适应性。

当然,我们还将继续维护5.4.x一段时间:正如往常一样,期待在下一轮中获得更多错误修复和改进。

小小的剧透:团队终于有了一些空闲时间来探索响应式数据库访问;我们正在研究下一代数据访问层,并从Eclipse VertX团队以及R2DBC的工作人员的指导下进行——但还有许多东西需要学习。

尽管如此,数据库供应商的路线图和采用情况仍然相当不明朗,所以我现在不会说更多。敬请关注!

如何获取此版本

详细说明和文档链接如往常一样,可在hibernate.org的专用页面上找到。

反馈、问题、想法?

要取得联系,请使用以下渠道

完整变更日志

您可以在这里(或,对于没有Hibernate Jira账户的人,这里)找到本版本的所有更改列表。

  • 错误修复

    • [HHH-13259] - StringHelper引起的StackOverflowError

    • [HHH-13466] - 当存在@PreUpdate监听器时,将Collection关联更改为Set时发生ClassCastException

    • [HHH-13544] - 在NationalizedTypeMappings中恢复对jdbc代码映射问题的日志警告

    • [HHH-13550] - 修复HHH-13424添加的测试的Oracle失败问题

    • [HHH-13551] - StrategyRegistrationProvider无法正确处理来自不同类加载器的实现

    • [HHH-13554] - QueryAndSQLTest.testNativeQueryWithFormulaAttributeWithoutAlias()在Oracle、MSSQL、Sybase、DB2、MariaDB上失败

    • [HHH-13555] - FetchGraphTest、MergeProxyTest 和 ProxyDeletionTest 由于 ConstraintViolationException 失败

    • [HHH-13556] - 在 DB2 上,动态获取滚动集合的测试失败

    • [HHH-13557] - LocalTimeTest#writeThenNativeRead 和 OffsetTimeTest#writeThenNativeRead 测试在 SQL Server 上失败

    • [HHH-13558] - InstantTest、LocalDateTimeTest、OffsetDateTimeTest、ZonedDateTimeTest 在 Sybase 上对 1600 年的测试失败

    • [HHH-13564] - Envers - 读取位于父 @MappedSuperclass 中的 @EmbeddedId 组合键实体的修订版本时出现 NPE

    • [HHH-13569] - org.hibernate.test.annotations.embedded.EmbeddedTest 在 Sybase 上失败

    • [HHH-13570] - 由于 Sybase 不支持带有 WITH(NOWAIT) 的 UPDATE 语句,测试失败

    • [HHH-13571] - 由于 Sybase 上的跨连接表超出了后续 JOIN 范围,测试失败

    • [HHH-13573] - 由于 Sybase 不支持外键定义上的级联删除,测试失败

    • [HHH-13574] - SybaseASE 不支持 PARTITION BY

    • [HHH-13577] - LockTest.testContendedPessimisticLock 和 StatementIsClosedAfterALockExceptionTest.testStatementIsClosed 在 Sybase 上失败

    • [HHH-13580] - LocalTimeTest#writeThenNativeRead* 和 OffsetTimeTest#writeThenNativeRead* 在 MySQL 上失败

    • [HHH-13581] - LocalTimeTest#writeThenRead* 和 OffsetTimeTest#writeThenRead* 在 MariaDB 上失败

    • [HHH-13582] - LocalDateTest 在 MySQL 上失败

    • [HHH-13586] - 当实体和查询结果都使用单个区域名称时,发生 ClassCastException

    • [HHH-13590] - 将非代理关联合并到 HibernateProxy 时出现 TransientObjectException

    • [HHH-13592] - AutoFlushEvent#isFlushRequired 总是返回 false

    • [HHH-13607] - 在使用不可变的自然 ID 刷新未初始化的增强代理时抛出异常

    • [HHH-13611] - 将 EntityMetamodel 构造函数的参数从 PersisterCreationContext 更改为 SessionFactoryImplementor

    • [HHH-13616] - 启用 hibernate-orm-modules 测试以 JDK 11

    • [HHH-13621] - hibernate.properties 中 javax.persistence.schema-generation.scripts.action 的值后有空格时出现异常

  • 新功能

    • [HHH-13249] - 引入一个选项,以记录慢查询而不是所有查询

  • 任务

    • [HHH-13525] - 使 SessionDelegatorBaseImplTest 更能够抵抗之前存在的别名定义

    • [HHH-13526] - 优化 ResourceRegistryStandardImpl#release

    • [HHH-13527] - org.hibernate.stat.internal.StatisticsImpl 中的性能回归

    • [HHH-13528] - 仅在释放所有语句的批次结束时调用 afterStatements

    • [HHH-13529] - org.hibernate.engine.spi.SessionFactoryImplementor#getDialect 中的性能回归

    • [HHH-13531] - 在 AliasConstantsHelper 中有更多重用常量池的机会

    • [HHH-13534] - AbstractLoadPlanBasedLoader 永远不需要 AfterLoadAction 的列表

    • [HHH-13546] - 将 StatisticsImpl 中的 sessionFactory 字段设为必需

    • [HHH-13549] - 清理 StringHelper 中的死代码

    • [HHH-13552] - CollectionType 需要对其 Persister 的直接引用

    • [HHH-13553] - 修复 SAP HANA 上的测试失败

    • [HHH-13561] - 不要多次检索相同的 ActionQueue

    • [HHH-13562] - JdbcResourceLocalTransactionCoordinatorImpl 的 TransactionObserver 列表应延迟初始化

    • [HHH-13563] - ResultSetReturnImpl 在每次构造时查找 JdbcServices

    • [HHH-13565] - 提高会话打开效率

    • [HHH-13568] - 如果可能,应延迟初始化 NaturalIdXrefDelegate 的实例

    • [HHH-13605] - InstantTest、OffsetDateTimeTest、ZonedDateTimeTest 在 CI 上对 MariaDB 失败

    • [HHH-13606] - LocalDateTimeTest 在 CI 上对 HANA 失败

    • [HHH-13622] - 升级 WildFly 事务客户端到 1.1.7.Final

  • 改进

    • [HHH-13133] - 在 Maven 增强插件中将以调试级别打印 '成功增强类' 的消息

    • [HHH-13412] - 将 hibernate.connection 描述从 c3p0 部分移动出来

    • [HHH-13512] - 如果没有更改要应用,则在 org.hibernate.internal.util.StringHelper#unquote(String[], Dialect) 中避免分配数组

    • [HHH-13521] - 避免过度验证启用的过滤器

    • [HHH-13522] - 通过懒加载初始化Map来优化LoadQueryInfluencers

    • [HHH-13523] - StatementPreparerImpl不需要频繁获取JDBCService

    • [HHH-13524] - 从JdbcCoordinatorImpl中删除未使用的字段xref和unassociatedResultSets

    • [HHH-13541] - AbstractSharedSessionContract中的ExceptionConverter实例应该被懒加载

    • [HHH-13548] - 由于SessionOwner已被弃用,SessionImpl中可以删除一些字段

    • [HHH-13576] - 在没有参数数组的情况下调用tracef()或debugf()实际上会分配一个空的Object[]

    • [HHH-13579] - ResourceRegistryStandardImpl中资源的清理会分配许多迭代器

    • [HHH-13584] - 在SessionFactory中的LocalConnectionAccess中减少ServiceRegistry查找

    • [HHH-13585] - 在PessimisticReadSelectLockingStrategy中重复释放资源

    • [HHH-13587] - 懒加载StatefulPersistenceContext选择集合的初始化

    • [HHH-13588] - MySQL方言:缺少函数:weight_string,to_base64,from_base64,regexp_replace,regexp_instr,regexp_substr

    • [HHH-13589] - ActionQueue中的内存分配改进

    • [HHH-13591] - 将数组迭代的使用替换为相应的for-each循环

    • [HHH-13594] - ResourceRegistryStandardImpl#release可以避免分配捕获的lambda表达式

    • [HHH-13599] - 在常见场景中避免在JtaTransactionCoordinatorImp中分配ArrayList

    • [HHH-13600] - 避免在ParameterTranslationsImpl和AbstractDomainDataRegion中分配捕获的lambda表达式

  • 弃用

    • [HHH-13595] - 弃用ConnectionObserver


返回顶部