一尘不染

dynamic-update = true如何在休眠状态下在内部工作?

hibernate

因此,我了解设置此属性 dynamic-update = true会 做什么,即,它仅考虑那些已修改的字段,并省略了为其他字段设置空值的工作。
节省开销,性能良好。

出于好奇而问:hibernate如何知道所有字段都被修改了?在触发更新查询之前,它是否先将选择查询生成的结果与数据库进行比较?假设是,那么比较不是性能的开销吗?

如我错了请纠正我。提前致谢!


阅读 334

收藏
2020-06-20

共1个答案

一尘不染

因此,经过将近两个月的等待,我终于能够在各种来源的帮助下得出以下建议作为对我自己问题的回答:

1.)使用时dynamic- update,Hibernate每次都必须生成相应的SQL字符串,因此Hibernate方面会降低性能。换句话说,在数据库端和hibernate端的开销之间需要权衡。

2.)Hibernate为每个实体缓存实际的SELECT,INSERT和UPDATE
SQL字符串。这样就不必在每次要查找,保留或更新实体时都重新创建这些语句。但是,使用时dynamic- update,Hibernate必须每次都生成相应的SQL字符串。这会导致hibernate方面的性能损失。

3.)应用于非常小的和简单的表时很有用,因为使用此注释可以显着提高性能。在更现实的情况下,在使用远程数据库的更大表上,性能提升可能会更加明显。当然,您从中获得的里程数会有所不同,大多数列都需要更新。

4.)@DynamicUpdate annotation/ dynamic-update=true用于指定每次修改实体时都应生成UPDATE
SQL语句。默认情况下,Hibernate使用缓存的UPDATE语句来设置所有表列。当使用注释对实体进行@DynamicUpdate注释时,PreparedStatement将仅包括其值已更改的列。

总体可以总结为:

  1. 运行时SQL生成开销。
  2. 不再使用PreparedStatement(缓存)。
  3. 性能开销。

积分 : _Hibernate的ORM 5.2.7.Final用户指南, http://memorynotfound.com/hibernate-
dynamic-update-attriburte-example/

PS:dynamic-insert=true/ @DynamicInsert注解也适用

2020-06-20