代码之家  ›  专栏  ›  技术社区  ›  cliff.meyers

Hibernate/JPA中注释字段或getter方法的性能差异

  •  8
  • cliff.meyers  · 技术社区  · 17 年前

    我很好奇是否有人对使用私有字段而不是公共getter方法注释实体之间的性能差异有任何确切的数字。我听说人们说字段的速度较慢,因为它们被称为“通过反射”,但话说回来,getter方法也是如此,不是吗?Hibernate在尝试读取字段之前需要将字段的可访问性设置为true,我可以看到它有一些可访问性 轻微的 头顶。然而,这难道不是在会话范围内的类级别完成的吗?或者在读取配置并构建SessionFactory时只完成一次?

    只是好奇这是神话还是真的有道理;我个人认为注释字段更具可读性。

    3 回复  |  直到 17 年前
        1
  •  9
  •   cliff.meyers    12 年前

    将5000条记录加载到一个简单的3列表中。将两个类映射到该表,一个使用带注释的私有字段,另一个使用带有注释的公共getter。运行30次Spring的HibernateTemplate.loadAll(),然后运行HibernateTemplate.clear()以清除会话缓存。结果(毫秒)如下。..

    方法总计6510种,平均217种

    字段总数:6586,平均值:219

    在为每个类添加更多属性后,我可能应该再尝试一次,但现在这种差异似乎没有统计学意义。

        2
  •  1
  •   Arthur Thomas    17 年前

    好吧,我不能给出数字哈哈,但我想通过反射访问字段不会是“一次性”的事情。每个对象都有自己的私有成员。

    老实说,我对反思了解不多,但实干家/决策者应该直截了当。事实上,你可以尝试将其中一个方法设置为private,我认为它不会起作用,因为它找不到它需要的方法。

    还有其他问题,比如代理,会影响getter方法,尽管这取决于你如何加载实体。

    这是我在文档中看到的所有内容:

    访问属性允许您进行控制 Hibernate将如何访问该属性 在运行时。默认情况下,Hibernate将 调用属性get/set对。如果你 指定access=“field”,Hibernate将 绕过get/set对并访问 直接场,使用反射。你 可以指定您自己的策略 通过命名一个类来访问属性 实现接口 org.hibernate.property。属性访问器。

    我的猜测是,总体而言,反思的成本会更高,但很抱歉。.无数字:(

        3
  •  0
  •   Pradip Bhatt    12 年前

    通常在getter方法的上面使用注释,因为当类在JVM路径中加载时,休眠模型或实体类也会被加载,那么如果你使用字段或属性的上面的注释,那么它在每次请求时只会执行一次。而如果你把getter放在refaction或任何其他层上,当它将缩放这个类时,getter方法会被调用,那么这将变得非常有用