【问题标题】:Performance difference between annotating fields or getter methods in Hibernate / JPAHibernate / JPA中注释字段或getter方法之间的性能差异
【发布时间】:2010-09-24 20:37:02
【问题描述】:

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

只是好奇这是一个神话还是真的有真相;我个人觉得注释字段更易读。

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

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

    方法总数:6510,平均:217

    字段总数:6586,平均:219

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

    【讨论】:

    • 5000 条记录在统计上不显着。您可以尝试使用更复杂的实体结构(需要连接)以及 100 倍的记录数吗?使用小型数据集,您将始终获得快速性能。
    • 致对未来感兴趣的人。我在IMDb 数据集上运行了非常相似的测试。我已经获取了演员表(超过 800k 行)以及他们的角色(1.3kk 行)。平均结果是: 基于字段的访问:17720 毫秒。基于属性的访问:17914 毫秒。
    【解决方案2】:

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

    老实说,我对反射知之甚少,但 getter/setter 应该是直截了当的。事实上,你可以尝试将其中一种方法设置为私有,但我认为它不会起作用,因为它找不到它需要的方法。

    还有其他问题,例如代理,会影响 getter 方法,但这取决于您加载实体的方式。

    这是我在文档中看到的全部内容:

    访问属性让你控制 Hibernate 将如何访问该属性 在运行时。默认情况下,Hibernate 将 调用属性获取/设置对。如果你 指定 access="field",Hibernate 将 绕过 get/set 对并访问 直接字段,使用反射。你 可以指定自己的策略 通过命名一个类来访问属性 实现接口 org.hibernate.property.PropertyAccessor。

    我的猜测是,一般来说反射的成本会更高,但抱歉.. 没有数字 :(

    【讨论】:

    • get/set 方法也需要通过反射调用。在编译时,Hibernate 无法知道它需要在一个类上调用哪些 get/set 对。我关于设置可访问性的观点是,它是在 java.lang.reflect.Field 实例上的类级别完成的......
    • 啊,是的,我想这是有道理的,因为它必须查找实际名称。
    • @cliff.meyers 它总是编译时间.... Hibernate 使用类生成和 AFAIK 将一个辅助类放入实体包中,因此它不需要反射,除了 private 成员(包私有很好)。
    【解决方案3】:

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

    【讨论】:

    • 您能否改进一下答案的措辞?我不认为这提供了现有答案中尚未涵盖的任何新内容,因此在对现有标记答案的评论中可能会更好。
    猜你喜欢
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 2011-05-16
    • 2011-09-16
    • 1970-01-01
    相关资源
    最近更新 更多