Разница в производительности между аннотирующими полями или методами получения в Hibernate / JPA - PullRequest
7 голосов
/ 02 декабря 2008

Мне было бы любопытно, если бы кто-нибудь имел какие-либо жесткие цифры в отношении разницы в производительности между аннотированием сущностей с использованием закрытых полей вместо общедоступных методов получения. Я слышал, что люди говорят, что поля медленнее, потому что они называются «через отражение», но опять же, методы получения, не так ли? Hibernate должен установить доступность поля в true, прежде чем он попытается прочитать его, что, как я вижу, имеет некоторые незначительные накладные расходы. Однако разве это не будет сделано на уровне класса в рамках сеанса или, возможно, только один раз, когда будет прочитана конфигурация и собрана SessionFactory?

Просто любопытно, миф ли это или правда ли в этом; Я лично нахожу, что комментирование полей более читабельно.

Ответы [ 3 ]

9 голосов
/ 02 декабря 2008

Загружены 5000 записей в простую таблицу из 3 столбцов. В эту таблицу сопоставлены два класса, один с использованием аннотированных закрытых полей, а другой с использованием аннотированных общедоступных методов получения. Запустил 30 запусков Spring HibernateTemplate.loadAll (), а затем HibernateTemplate.clear () для очистки кеша сеанса. Результаты в мс ниже ...

методов всего: 6510, в среднем: 217

полей всего: 6586, в среднем: 219

Я, вероятно, должен сделать еще один удар после добавления дополнительных свойств к каждому классу, но сейчас разница не кажется статистически значимой.

1 голос
/ 02 декабря 2008

хорошо, я не могу дать цифры, ха-ха, но я бы предположил, что доступ к полям с помощью отражения не будет «разовым». У каждого объекта есть свои закрытые члены.

Честно говоря, я немного знаю об отражении, но геттер / сеттеры должны быть прямыми. На самом деле вы можете попробовать установить один из методов как приватный, и я думаю, что он не сработает, потому что не может найти нужный метод.

Существуют и другие проблемы, такие как прокси, которые влияют на методы получения, хотя и зависят от того, как вы загружаете свои объекты.

Это все, что я вижу в документации:

Атрибут доступа позволяет вам контролировать как Hibernate получит доступ к свойству во время выполнения. По умолчанию Hibernate будет вызвать свойство получить / установить пару. если ты указать доступ = "поле", Hibernate будет обойти пару get / set и получить доступ к поле непосредственно, используя отражение. Вы можете указать свою собственную стратегию доступ к собственности, назвав класс, который реализует интерфейс org.hibernate.property.PropertyAccessor.

Я предполагаю, что отражение в целом будет более дорогостоящим, но извините .. без цифр: (

0 голосов
/ 12 марта 2013

Обычно используют аннотацию в методах getter, указанную выше, потому что, когда класс загружается в JVM, если эта модель гибернации или класс сущности также загружаются, тогда, если вы используете аннотацию над полем или peroperty, тогда он будет выполняться только один раз за каждый запрос , тогда как если вы поместите выше getter, затем в reflaction или любом другом слое, когда он будет вызывать этот класс, тогда вызывается метод getter, тогда это станет очень полезным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...