一个令人兴奋的微更新?!
版本 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的专用页面上找到。
或者直接跳转到bintray。
完整变更日志
-
错误修复
-
[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
-