【发布时间】:2012-08-24 14:28:32
【问题描述】:
如果有人已经回答了这个特定的问题,但我还没有找到我的问题的答案,那么请提前抱歉。
我正在开发一个应用程序(不,我不能为工作提供代码,所以我很抱歉那个),它使用 DAO 和 Hibernate 和 POJO 以及所有用于通信和写入数据库的东西。假设我在调用 Session.flush() 时没有大量数据要检查,这对于应用程序来说效果很好。话虽如此,有一个页面,用户可以在其中向产品添加任意数量的项目,并且有一个特殊情况,其中有 25 个项目。每个项目大约有 8 个字段,它们都存储在数据库中。当我调用刷新时,它会将所有内容保存到数据库中,但需要 FOREVER 才能完成。我打电话的三行是:
merge(myObject);
Session.flush();
Session.refresh(myObject);
我已经尝试了许多不同的组合来解决这个问题和许多不同的解决方案,所以回来说“不要使用flus()”并没有太大帮助,因为 saveOrUpdate() 和其他休眠会话似乎不起作用。我能想到的唯一解决方案是废弃整个项目(我们得到的代码是继承的,至少可以说写得不好),或者告诉用户社区接受它。
我从 Hibernate API 了解到,如果您想将数据写入数据库,它会检查每个项目,如果存在差异,它会创建一个更新查询队列,然后运行查询。似乎每次都在更新此数据,因为即使其他值未更改,我的数据库中的“DATE_CREATED”列也不同。
我想知道是否有另一种方法可以防止提交如此大量的数据,或者是否有一种方法可以从“检查”休眠中排除该特定列,这样我就不必提交所有 25 个项目,如果我只改成 1 了吗?
提前致谢。
迈克
【问题讨论】:
-
25 并不是很多,除非对象是巨大的。无论如何,每个项目是在自己的会话中处理,还是在刷新之前都被添加到会话中?
-
好吧,事实证明它更像是 60 多个对象哈哈。我不记得有多少,但现在有多少。不过,每个项目都被添加到同一个会话中,最后我调用了flush。我尝试将 POJO 中的 dateCreated 字段设置为 updatable=false,以确保不会在该字段上发生检查,这是问题所在,但没有奏效。有什么想法吗?
-
你需要弄清楚是什么花费了时间。是对象操作,数据库插入,等等......
-
需要这么长时间的事实是,所有对象都在根据数据库进行检查,并且由于每个对象的时间戳都与上次修改时不同,因此根据需要将其标记为更新。我想通过说差异是 DATE_CREATED 来防止这种情况发生并不意味着数据是脏的。我只需要知道该怎么做。
标签: java database performance hibernate flush