There has been a similar thread here already (https://groups.google.com/forum/#!searchin/google-guice/Should$20Guice-Injected$20DAO$27s$20be$20Singletons$3F/google-guice/3B8XrwB-p18/B6OF13HWRnEJ) but I don't think it has received a satisfying answer yet.
The baseline: We are using Guice in a JSF/Primefaces webapplication running on Tomcat. Persistence is handled via JPA/Hibernate. Right now ALL our DAOs (approx. one per Entity) are annotated as @Singleton. The only reason for this seem to be performance concerns as another (non JSF but Webservice) part of the application will receive thousands of hits per seconds and our main developer believes, that constructing a DAO Singleton once and then getting it in a synchronized way is cheaper than to always inject a new instance (which is the Guice Default Scope). This goes contrary to what the Google Guice Wiki writes about Scopes: If the object is *stateless* and *inexpensive to create*, scoping is unnecessary. Leave the binding unscoped and Guice will create new instances as they're required...Although singletons save object creation (and later garbage collection), initialization of the singleton requires synchronization; ... Now, what exactly does "initialization of the singleton" mean in this context? Is initialization done once? Everytime it is injected? Is the assumption correct that, with the above scenario (thousands of hits per second) using @Singleton annotated DAOs is faster and better resource wise than using Default Scope? As we use @Singleton for our DAOs we don't inject the EntityManager directly but use an EntityManagerProvider which, as I understand it, is the correct way as the Provider is considered threadsafe which is a requirement for @Singleton. Is there a "Google approved" way to include Hibernate using DAOs in your web application? At what Layer would you set @Transactional? We had it on our DAO layer which was wrong as it led to a lot of single transactions (we are used to JEE where, on default, a transaction gets used if present). Now we have it in our Service Layer (Services, are also @Singleton which I also don't like...) which bundle/inject/use lots of different DAOs. Would you consider this to be correct to get proper transaction handling when bundling multiple DAOs? -- You received this message because you are subscribed to the Google Groups "google-guice" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/google-guice. To view this discussion on the web visit https://groups.google.com/d/msgid/google-guice/0e4c8e3b-441e-47ce-91fb-d0c45ae58779%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
