【问题标题】:Hibernate Interceptor Fetch vs LoadHibernate 拦截器获取与加载
【发布时间】:2014-05-29 16:50:17
【问题描述】:

我已经编写了一个拦截器来记录onLoad 事件,但我希望能够区分加载和获取——即,Hibernate 是否必须从数据库中获取实体,或者它是否只是从一个它的缓存。

我不能使用 Hibernate 统计信息的原因是因为我想更细粒度地分析什么方法导致了哪个加载/获取/查询,这就是我使用拦截器的原因。所以我想我的问题是,如何使用拦截器区分加载和获取?

提前致谢!

【问题讨论】:

    标签: hibernate load statistics fetch interceptor


    【解决方案1】:

    经过大量的探索,我真正要寻找的是loadFromDatasource in DefaultLoadEventListener。 Hibernate 将使用event.isAssociationFetch() 来查看它是否应该在其统计信息中将其记录为获取。覆盖此方法并添加该检查将完全反映 Hibernate 统计信息。

    我可以通过这个:In hibernate statistics whats the difference between load and fetch 来追踪它,并通过这个:eventlisteners using hibernate 4.0 with spring 3.1.0.release? 注册事件监听器

    但是,我注意到的一件事是您将要清除事件侦听器组,否则会有他们的默认侦听器,它将获取对象,当您的侦听器检查时,它会认为该对象已经fetched(它拥有),因此不会将其记录在您的统计信息中。

    【讨论】:

      【解决方案2】:

      您可以尝试扩展DefaultPostLoadEventListener,而不是使用拦截器。

      事件系统让您可以更好地控制实体状态更改事件。

      【讨论】:

      • 我对这个 API 有点困惑——这只是在 Hibernate 必须从数据库中获取实体时调用,还是在每次实体加载后调用?
      • 最好试一试,看看它什么时候被调用。
      • 看起来 postLoad 每次加载实体时都会被调用,这不是我想要的。为了测试这一点,我放入了一个原子计数器并将其与 Hibernate 的统计数据进行比较。它显示的数字与 Entity Loads 的数量完全相同,但与 Entity Fetches 的数量不同。你知道一种only监听获取事件的方法吗?
      • 不知道有没有这样的事件。
      • 啊——真不幸。那么 Hibernate Statistics 是如何跟踪的呢?
      猜你喜欢
      • 2023-03-31
      • 1970-01-01
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      • 2018-01-20
      • 2019-04-12
      • 2017-01-22
      相关资源
      最近更新 更多