Java hibernate做预测缓存吗?
我们的DBA刚刚带着一个针对SQL server数据库的长时间运行的查询回来。他认为我们应该回顾一下这个问题,看看是否可以优化 问题是查询不是来自我们的应用程序代码。它是通过主键从一个表中加载多个记录,确切地说是九个,并且我们的应用程序从未通过主键对该表进行任何查询。它也确实是一个hibernate查询,它的名称是hibernate所做的破坏和所有属性的加载 所以我想知道hibernate是否做了一些预测性的缓存,比如提取它认为我以后可能需要的记录。有什么意见吗Java hibernate做预测缓存吗?,java,hibernate,sql-server-2008-r2,Java,Hibernate,Sql Server 2008 R2,我们的DBA刚刚带着一个针对SQL server数据库的长时间运行的查询回来。他认为我们应该回顾一下这个问题,看看是否可以优化 问题是查询不是来自我们的应用程序代码。它是通过主键从一个表中加载多个记录,确切地说是九个,并且我们的应用程序从未通过主键对该表进行任何查询。它也确实是一个hibernate查询,它的名称是hibernate所做的破坏和所有属性的加载 所以我想知道hibernate是否做了一些预测性的缓存,比如提取它认为我以后可能需要的记录。有什么意见吗 谢谢。这可能是由于以下原因执行的
谢谢。这可能是由于以下原因执行的查询: 使用批处理获取,Hibernate可以加载几个未初始化的代理 如果访问了一个代理。批取是对 延迟选择抓取策略 类/实体的批量抓取更容易理解。考虑 以下示例:在运行时,有25个Cat实例加载到 一个会话,每只猫都有一个对它的主人,一个人的引用。这个 Person类映射为一个代理,lazy=“true”。如果你现在迭代 通过所有猫并在每个猫上调用getOwner(),Hibernate将 默认情况下,执行25条SELECT语句来检索代理的所有者。 可以通过在映射中指定批大小来调整此行为 个人:
<class name="Person" batch-size="10">...</class>
。。。
Hibernate现在只执行三个查询:模式是10,10,
五,
Hibernate本身不做任何预测性缓存,除了 但是,Hibernate可以简单地获取您请求的实体——例如,它获取急切关系的目标,并在惰性关系的情况下初始化访问的惰性代理 因此,如果所讨论的表作为某些关系的目标,您需要检查这些关系是否渴望,以及如果它们懒惰,您如何访问它们