Java Hibernate Session.flush()效率问题

Java Hibernate Session.flush()效率问题,java,database,performance,hibernate,flush,Java,Database,Performance,Hibernate,Flush,如果有人已经回答了这个特定的问题,请提前道歉,但我还没有找到我的问题的答案,所以现在开始 我正在开发一个应用程序(不,我不能给出一个作业的代码,所以我很抱歉),它使用DAO、Hibernate、POJO以及所有用于通信和写入数据库的东西。如果在调用Session.flush()时没有大量数据要检查,那么这对应用程序来说非常有效。这就是说,有一个页面,用户可以向产品添加任意数量的项目,有一个特殊情况,其中有25个项目。每个项目大约有8个字段,每个字段都存储在数据库中。当我调用flush时,它确实会

如果有人已经回答了这个特定的问题,请提前道歉,但我还没有找到我的问题的答案,所以现在开始

我正在开发一个应用程序(不,我不能给出一个作业的代码,所以我很抱歉),它使用DAO、Hibernate、POJO以及所有用于通信和写入数据库的东西。如果在调用Session.flush()时没有大量数据要检查,那么这对应用程序来说非常有效。这就是说,有一个页面,用户可以向产品添加任意数量的项目,有一个特殊情况,其中有25个项目。每个项目大约有8个字段,每个字段都存储在数据库中。当我调用flush时,它确实会将所有内容保存到数据库中,但需要花费很长时间才能完成。我打的三条电话是:

merge(myObject);
Session.flush();
Session.refresh(myObject);
我尝试了许多不同的组合方法来解决这个问题,也尝试了许多不同的解决方案,因此,回来说“不要使用flus()”并没有多大帮助,因为saveOrUpdate()和其他hibernate会话似乎不起作用。我能想到的唯一解决方案是放弃整个项目(我们得到的代码是继承的,至少可以说写得很糟糕),或者告诉用户社区接受它

我从HibernateAPI中了解到,如果要将数据写入数据库,它会对每个项目进行检查,如果存在差异,它会创建一个更新查询队列,然后运行查询。似乎每次都会更新此数据,因为我的数据库中的“DATE_CREATED”列是不同的,即使其他值不变

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

提前谢谢

迈克

我想知道的是,是否有另一种方法可以防止这种情况发生 大量提交数据或排除特定列的方法 从“检查”开始,hibernate这样做,我不必提交所有25项 如果我改成1

我将分析应用程序,以确保flush上的脏检查实际上是问题所在。如果您发现确实如此,您可以使用execute来管理会话大小

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

好吧,除非您使用一个。当然,这样做会丢失很多特性(延迟加载等),但这取决于您做出的决定

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

@Entity(dynamicUpdate = true)
class MyClass
使用该选项,Hibernate将只更新修改过的列。在小表中,只有很少的列,这不是很有效,但在您的情况下,它可能有助于加快整个过程,因为您无法避免使用常规Hibernate会话进行脏检查。更新一些列而不是整个对象总是更好的,对吗?
更多关于动态更新属性的内容。

25实际上并不多,除非对象是巨大的。不管怎么说,每个项目是在自己的会话中处理的,还是在刷新之前都被添加到会话中?好吧,那么结果更像是60多个对象哈哈。我不记得有这么多了,但现在有这么多了。不过,每个项目都被添加到同一个会话中,最后我调用flush。我尝试将POJO中的dateCreated字段设置为Updateable=false,以确保不会对该字段进行检查,这是问题所在,但没有起作用。有什么想法吗?你需要弄清楚是什么在浪费时间。是对象操作,db插入,等等……花费这么长时间的事实是,所有对象都是根据db进行检查的,因为每个对象都有一个不同于上次修改时的时间戳,所以它被标记为需要更新。为了防止这种情况发生,我想说,创建日期不同并不意味着数据脏。我只需要知道如何做到这一点。这听起来至少可以在解决性能问题方面起到一定的作用。我还将研究无状态会话,因为我不认为延迟加载是用户没有的东西。谢谢你的帮助。如果你还有别的想法,请把它贴出来。看一看。关于无状态会话,我不是说你必须在任何地方使用它。就在您需要使用上述批次的地方。;)