2014-12-03 2 views
1

Был задан аналогичный вопрос уже по адресу (https://groups.google.com/forum/#!searchin/google-guice/Should $ 20Guice-Injected $ 20DAO $ 27s $ 20be $ 20Singletons $ 3F/google-guice/3B8XrwB-p18/B6OF13HWRnEJ), но Я не думаю, что он получил удовлетворительный ответ.Правильный Scopehandling в GUICE @Singleton против стандарта по умолчанию

Базовая линия: Мы используем Guice в веб-приложении JSF/Primefaces, работающем на Tomcat. Стойкость обрабатывается через JPA/Hibernate.

В настоящее время ВСЕ наши DAO (около одного на каждый объект) аннотируются как @Singleton. Единственная причина для этого, похоже, связана с производительностью, поскольку другая часть (не JSF, но Webservice) будет получать тысячи обращений в секунду, и наш главный разработчик полагает, что создание DAO Singleton один раз, а затем получение его синхронным образом дешевле, чем всегда вводить новый экземпляр (который является областью по умолчанию Guice). Это противоречит тому, что пишет в Guicy Wiki о Scopes: если объект не имеет апатридов и недорого для создания, то определение области необязательно. Оставьте привязку не облажаемой, и Guice создаст новые экземпляры, поскольку они необходимы ... Хотя синглтоны сохраняют создание объекта (и позже сбор мусора), для инициализации синглета требуется синхронизация; ...

Теперь, что именно означает «инициализация синглтона» в этом контексте? Выполняется ли инициализация один раз? Каждый раз, когда он вводится?

Является ли предположение правильным, что с учетом приведенного выше сценария (тысячи обращений в секунду) с использованием аннотированных DAO с помощью @Singleton быстрее и лучше ресурсов, чем с использованием параметра по умолчанию?

Поскольку мы используем @Singleton для наших DAO, мы не вводим EntityManager напрямую, а используете EntityManagerProvider, который, насколько я понимаю, является правильным способом, поскольку поставщик считается потокобезопасным, что является требованием для @Singleton. Есть ли способ, одобренный Google, включить Hibernate с использованием DAO в вашем веб-приложении?

+0

Я считаю, что «Оставьте привязку не облажаемой, и Guice создаст новые экземпляры, поскольку они требуются ...» комментарий там, чтобы разработчики не смешивали области. Можете ли вы добавить дополнительную информацию о своей области EntitiyManager? Как вы справляетесь с открытием и закрытием контекста EM? Лично я считаю, что «Синглтон» на месте и будет работать лучше, потому что немного на GC и инициализации. В любом случае вам нужно знать, как смешивать инъекции с различными областями и вводить «EntityManager» в качестве поставщика, что вы сделали, поэтому вы все настроены, gj. –

+0

> Можете ли вы добавить дополнительную информацию о своей области EntitiyManager? Что вы подразумеваете под областью EntityManager? Как вы справляетесь с открытием и закрытием контекста EM? --- Теперь мы используем аннотацию @Transactional от guice-persist, но, поскольку я узнал, что он больше не поддерживается, мы, вероятно, перейдем к onami-persist. –

+0

Где вы узнали, что 'guice-persist' больше не поддерживается? Кажется, что последние коммиты. –

ответ

2

Хотя синглтоны сохраняют создание объекта (и позже сбор мусора ), для инициализации синглета требуется синхронизация; ...

Теперь, что именно означает «инициализация синглтона» в этом контексте ? Выполняется ли инициализация один раз? Каждый раз, когда он вводится?

Here - это реализация одноэлементного пространства (он немного отличается в выпущенной версии Guice, но следующие пункты все еще стоят). Каждый раз, когда зависимость с одноточечной областью вводится куда угодно, метод get() этого провайдера будет вызван, чтобы получить экземпляр.

Блокировка с двойным проверкой используется для того, чтобы после того, как синглтон был создан в первый раз, будущие звонки на номер get() дешевы: они читают одно поле volatile и возвращаются.

С другой стороны, использование @Singleton объектов DAO означает, что вы должны получить доступ к EntityManager через Provider в каждом методе, который включает в себя, глядя на EntityManager в HashMap в ThreadLocal где-то.

Вывод: единственный способ найти, какой выбор лучше для производительности, - это сравнить оба и выбрать более быстрый. Вероятно, вы обнаружите, что оба варианта достаточно быстры, и в этом случае вы должны выбрать самый чистый.

+0

Я выполнил некоторые (не исчерпывающие) тесты производительности и не смог измерить существенную разницу между Singleton и областью по умолчанию, даже после проведения тестов с запросами 100k + для запуска запусков сбора мусора и т. Д. Итак, я приму ваш ответ, поскольку он я действительно отвечаю на мои вопросы, но в любом случае это было наиболее информативно (особенно информация о двойной проверке блокировки). Тем не менее, мне показалось странным, что у Google Dev нет надлежащей информации об этом, нет ответов от разработчиков Google в списке рассылки google guice, и некоторые учебные пособия настаивают на использовании Singleton Scope. –

Смежные вопросы