Был задан аналогичный вопрос уже по адресу (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 в вашем веб-приложении?
Я считаю, что «Оставьте привязку не облажаемой, и Guice создаст новые экземпляры, поскольку они требуются ...» комментарий там, чтобы разработчики не смешивали области. Можете ли вы добавить дополнительную информацию о своей области EntitiyManager? Как вы справляетесь с открытием и закрытием контекста EM? Лично я считаю, что «Синглтон» на месте и будет работать лучше, потому что немного на GC и инициализации. В любом случае вам нужно знать, как смешивать инъекции с различными областями и вводить «EntityManager» в качестве поставщика, что вы сделали, поэтому вы все настроены, gj. –
> Можете ли вы добавить дополнительную информацию о своей области EntitiyManager? Что вы подразумеваете под областью EntityManager? Как вы справляетесь с открытием и закрытием контекста EM? --- Теперь мы используем аннотацию @Transactional от guice-persist, но, поскольку я узнал, что он больше не поддерживается, мы, вероятно, перейдем к onami-persist. –
Где вы узнали, что 'guice-persist' больше не поддерживается? Кажется, что последние коммиты. –