java - Hibernate Session.flush()效率问题

标签 java database performance hibernate flush

如果有人已经回答了这个具体问题,但我还没有找到我的问题的答案,那么提前道歉。

我正在开发一个使用 DAO、Hibernate 和 POJO 以及所有用于通信和写入数据库的东西的应用程序(不,我不能给出工作代码,所以我很抱歉)。如果我在调用 Session.flush() 时没有大量数据要检查,这对应用程序来说效果很好。也就是说,有一个页面,用户可以在其中向产品添加任意数量的项目,并且有一种特殊情况,其中有大约 25 个项目。每个项目大约有 8 个字段,全部存储在数据库中。当我调用刷新时,它确实将所有内容保存到数据库中,但它需要永远才能完成。我调用的三行是:

merge(myObject);
Session.flush();
Session.refresh(myObject);

我已经尝试了很多不同的组合来解决这个问题和很多不同的解决方案,所以回来说“不要使用 flus()”并没有多大帮助,因为 saveOrUpdate() 和其他 hibernate session 似乎不起作用。我能想到的唯一解决方案是废弃整个项目(我们得到的代码是继承的,至少可以说写得不好)或者告诉用户社区接受它。

根据我对 Hibernate API 的理解,如果您想将数据写入数据库,它会对每个项目运行检查,如果存在差异,它会创建一个更新查询队列,然后运行查询。似乎每次都在更新此数据,因为即使其他值未更改,我数据库中的“DATE_CREATED”列也不同。

我想知道是否有另一种方法可以防止如此大量的数据提交,或者有一种方法可以将特定列从“检查” hibernate 中排除,这样我就不必提交所有 25 个项目,如果我只更改为 1?

提前致谢。

迈克

最佳答案

嗯,除非你使用 StatelessSession,否则你真的无法避免 hibernate 中的脏检查.当然,你会失去很多功能(延迟加载等),但这个决定取决于你。

另一种选择:我肯定会尝试在您的实体中使用 dynamic-update=true。喜欢:

@Entity(dynamicUpdate = true)
class MyClass

使用它,Hibernate 将只更新修改的列。在列数很少的小表中,它不是那么有效,但在您的情况下,它可能有助于加快整个过程,因为您无法避免使用常规 Hibernate Session 进行脏检查。更新几列而不是整个对象总是更好,对吧? This post详细讨论动态更新属性。

关于java - Hibernate Session.flush()效率问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12111350/

相关文章:

java - 如何使用调制解调器或网关从 java Web 应用程序发送短信?

添加更多对象时,Java Runtime.freeMemory() 返回奇怪的结果

android studio sqlite 异常

Oracle 数据库中的 REGEXP 挫败感

javascript - 在运行时确定浏览器是否太慢而无法优雅地处理复杂的 JavaScript/CSS 的最佳方法是什么?

java - 在 Swing 面板上排列 Swing 组件

java - 如何设置包版本

php - 尝试一次更新两个表 MySQL

performance - 检查向量是否增加矩阵等级的最快方法

javascript - 在 JavaScript 中拆分定界字符串与 JSON 解析效率