hibernate session.flush()效率问题

7lrncoxx  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(327)

抱歉,如果有人已经回答了这个具体的问题,但我还没有找到一个答案,我的问题,所以这里去。
我正在开发一个应用程序(不,我不能给出代码,因为这是一个工作,所以我很抱歉),它使用dao的,hibernate的,pojo的和所有的东西来通信和写入数据库。如果在调用session.flush()时没有太多的数据要检查,那么这对应用程序很有效。也就是说,有一个页面,用户可以在其中向产品添加任意数量的项目,还有一个特定的情况,其中有25个项目。每个条目有8个字段,每个字段都存储在数据库中。当我调用flush时,它确实会将所有内容保存到数据库中,但需要很长时间才能完成。我打的三条电话是:

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

我尝试了许多不同的组合方法来解决这个问题,也尝试了许多不同的解决方案,所以说“不要使用flus()”并没有多大帮助,因为saveorupdate()和其他hibernate会话似乎不起作用。我能想到的唯一解决方案是放弃整个项目(我们得到的代码是继承的,至少可以说写得很糟糕),或者告诉用户社区接受它。
我从hibernateapi了解到,如果您想将数据写入数据库,它会对每个项目进行检查,如果有差异,它会创建一个更新查询队列,然后运行查询。似乎每次都会更新此数据,因为即使其他值不变,数据库中的“date\u created”列也会不同。
我想知道的是,是否有另一种方法来防止如此大的数据提交,或者有一种方法将特定列从“检查”中排除,hibernate是否这样做?如果我只更改为1,我就不必提交所有25项?
提前谢谢。
迈克

ykejflvf

ykejflvf1#

我想知道的是,是否有另一种方法来防止如此大的数据提交,或者有一种方法将特定列从“检查”中排除,hibernate是否这样做?如果我只更改为1,我就不必提交所有25项?
我将分析应用程序,以确保flush上的脏检查实际上是问题所在。如果您发现确实如此,可以使用execit来管理会话大小。

session.update(myObject);
session.flush();
session.evict(myObject);
vdgimpew

vdgimpew2#

嗯,除非使用无状态会话,否则在hibernate中确实无法避免脏检查。当然,您会因此失去很多特性(延迟加载等),但这取决于您自己。
另一种选择:我肯定会尝试在您的实体中使用dynamicupdate=true。比如:

@Entity(dynamicUpdate = true)
class MyClass

使用它,hibernate将只更新修改过的列。在小表中,只有很少的列,它不是那么有效,但是在您的情况下,它可能有助于加快整个过程,因为您无法避免常规hibernate会话的脏检查。更新一些列而不是整个对象总是更好的,对吧?这篇文章将详细讨论动态更新属性。

相关问题