当前位置:  开发笔记 > 数据库 > 正文

dynamic-update = true如何在hibernate内部工作?

如何解决《dynamic-update=true如何在hibernate内部工作?》经验,为你挑选了1个好方法。

所以我理解dynamic-update = true这个属性的设置是什么,即它只考虑那些被修改的字段,并省略了为其他字段设置空值的工作.节省开销,提高性能.

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

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



1> robot_alien..:

所以经过近两个月的等待,我终于能够得出这个结论,作为我自己问题的答案,并得到各方面的帮助:

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将仅包括其值已更改的列.

总体可归纳为:

    运行时SQL生成开销.

    没有使用PreparedStatement(缓存)了.

    性能开销.

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

PS:对于dynamic-insert=true/ @DynamicInsert注释也适用

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有