当会话缓存大量对象时,休眠事务提交的速度非常慢

时间:2019-03-22 08:52:17

标签: java hibernate

两张表A(25k行)和B(2.2m行),使用休眠会话加载所有这些数据(每一行代表一个对象),然后在事务中只更新A中的一行和B中的一行发现休眠行为很奇怪:提交耗时约1.5秒才能返回。但是,sql数据库的日志显示sql update命令仅消耗几毫秒。在将sql命令刷新到数据库之前,hibernate会消耗大部分时间。

所以我使用jprofiler找出它在做什么:

the cpu recording data

关于如何消耗时间没有任何线索。由于数据库执行更新命令的速度非常快,因此它一定不能被数据库阻止。如果正在执行计算,则应由jprofiler记录(耗时)。

在这里做什么冬眠?为什么提交这么慢?

1 个答案:

答案 0 :(得分:1)

如果您已经装载了超过200万个位于Hibernate的一级缓存中的对象,那么事情变慢就不会感到惊讶。该时间最有可能花费在所有这些对象上以寻找更改。如果您知道不需要某个对象,则可以从缓存中逐出该对象。这将减少内存消耗并加快最终提交的速度。请注意不要驱逐实际需要的对象,否则会造成讨厌的错误!