2012-08-24 67 views
3

对不起,如果有人已经回答了这个具体问题,但我还没有找到我的问题的答案,所以在这里。休眠Session.flush()效率问题

我正在研究一个应用程序(不能,因为它是一个工作,所以我对此感到抱歉),它使用DAO,Hibernate和POJO以及所有这些东西来进行通信和写入数据库。这适用于应用程序,假设我在调用Session.flush()时没有大量数据来检查。话虽如此,有一个页面,用户可以添加任意数量的项目到一个产品,并且有一个特定的情况,其中有25个项目的内容。每个项目有大约8个字段,全部存储在数据库中。当我调用flush时,它会将所有内容保存到数据库中,但需要FOREVER才能完成。三条线我打电话是:

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

我已经尝试了很多事情来解决这个问题,和一些不同的解决方案,以便回来,说:“不要用流感略有相似之处()” ISN不同的组合因为saveOrUpdate()和其他休眠会话似乎不起作用。我能想到的唯一解决方案是废弃整个项目(我们得到的代码是遗传的,编写得很少),或者告诉用户社区吸收它。

这是我从Hibernate API的理解,如果你想写数据到数据库,它会对每个项目运行一次检查,如果有差异,它会创建一个更新查询队列,然后运行查询。看起来这些数据每次都在更新,因为即使其他值不变,我数据库中的“DATE_CREATED”列也是不同的。

我想知道的是,如果有另一种方法来阻止如此大量的数据提交或从“check”hibernate中排除特定列的方式,那么我不必提交所有25个项目,如果我只改变了1?

在此先感谢。

迈克

+0

25并不是真的那么多,除非物体是巨大的。无论如何,每个项目是在自己的会话中处理的,还是都在冲洗前被添加到会话中? – hvgotcodes

+0

好吧,原来它更像是60+对象哈哈。我不记得这么多,但现在有多少。尽管每个项目都被添加到同一个会话中,但最后我会调用flush。我试着将POJO中的dateCreated字段设置为updatable = false,作为确保检查不会发生在该字段上的问题,但这不起作用。有什么想法? –

+0

你需要弄清楚什么是花时间。是对象操作,数据库插入,无论什么...... – hvgotcodes

回答

1

我想知道是,如果有另一种方式来防止这种 大数据或排除来自特定列 的“检查”休眠这样做我不”的方式提交如果我只对1进行了更改,则必须提交全部25个项目 。

我会对应用程序进行配置文件,以确保对刷新的脏检查实际上是问题。如果您发现确实如此,则可以使用evict来管理会话大小。

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

那么,你真的无法避免在休眠中的脏检查,除非你使用StatelessSession。当然,你会因此丧失很多功能(延迟加载等),但这取决于你做出这个决定。

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

@Entity(dynamicUpdate = true) 
class MyClass 

使用它,Hibernate将只更新修改列。在小列表中,列数很少,但效率不高,但在您的情况下,它可以帮助使整个过程更快,因为您无法避免使用常规Hibernate会话进行脏检查。更新几列而不是整个对象总是更好,对吗? This post有关动态更新属性的更多信息。

+0

这听起来似乎至少可以修复性能问题。我也会研究StatelessSession,因为我认为懒加载是用户不能没有的东西。谢谢您的帮助。如果你想其他的东西,请发布。 –

+0

是的。看一看。关于StatelessSession,我并不是说你必须在任何地方使用它。就在上面那种情况下,你需要使用批处理。 ;) –